You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理StackTraceElement异常?页面可跳转报错的排查方案

UI异常排查:clickNewPurchase()抛出异常但页面跳转正常的问题

问题描述

遇到UI异常:Exception in clickNewPurchase(): [Ljava.lang.StackTraceElement;@52e6b75,页面虽能正常跳转到下一页,但需明确异常产生原因、精确定位问题位置,并找到避免异常的解决办法。

相关代码与报错堆栈

clickNewPurchase()方法代码

private void clickNewPurchase() throws Throwable {
    try {
        List<WebElement> listOfbuttons = createElements(newPurchase);
        for (WebElement element : listOfbuttons) {
            String value = element.getAttribute("value");
            if (value.equals("New Purchase") || value.equals("RePurchase")) {
                JavascriptExecutor executor = (JavascriptExecutor)driver.get();
                executor.executeScript("arguments[0].click();", element);
                baseClass.logInfo("Clicked on New Purchase / RePurchase button on Start a Purchase page");
                waitforVisibilityOfElement(currentPage);
                break;
            }else if (value.equals("Retrieve")) {
                masterData.get().put("IncompletePurchase", "True");
                JavascriptExecutor executor = (JavascriptExecutor)driver.get();
                executor.executeScript("arguments[0].click();", element);
                baseClass.logInfo("Clicked on Retrieve button on Start a Purchase page");
                waitforVisibilityOfElement(currentPage);
                break;
            }
        }
    } catch (Exception e) {
        softAssertFail("Exception in clickNewQuote(): " + Arrays.toString(e.getStackTrace()), ValidationType.UI);
        e.printStackTrace();
    }
}

报错堆栈信息

java.lang.AssertionError: The following asserts failed:
<br> <b>>>></b> UI : Exception in clickNewPurchase(): [Ljava.lang.StackTraceElement;@3bea26bc
at org.testng.asserts.SoftAssert.assertAll(SoftAssert.java:43)
at tests.P2Test.p2Test(P2Test.java:167)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)

P2Test类第167行代码

try {
    if (sam.getSoftAssert() != null)
        sam.getSoftAssert().assertAll();
} catch (Exception e) {
    Assert.fail("Problem in Soft assert: " + e.getCause());
}

异常原因分析

  1. 日志输出错误:catch块中直接用Arrays.toString(e.getStackTrace())输出堆栈数组,导致显示的是对象内存地址而非可读的异常详情,无法直接定位具体异常类型和触发位置。同时代码存在笔误:错误信息里写的是clickNewQuote(),实际方法是clickNewPurchase()。
  2. 潜在异常场景:
    • createElements(newPurchase)获取元素列表时,可能因定位器失效、元素未加载完成抛出异常
    • element.getAttribute("value")可能因页面跳转/刷新导致元素过期,抛出StaleElementReferenceException
    • waitforVisibilityOfElement(currentPage)等待元素可见时,可能因超时或定位器错误抛出异常
    • 页面跳转成功不代表代码流程无异常,只是异常被catch块捕获,未阻断页面操作

问题定位方法

  1. 修复日志输出:将catch块中的异常信息改为e.toString()或拼接完整堆栈详情,获取可读的异常类型和调用链。
  2. 增加关键步骤日志:在createElements、getAttribute、waitforVisibilityOfElement等步骤前后添加日志,明确异常触发环节。
  3. 捕获具体异常类型:在catch块中打印e.getClass().getName(),精准定位是哪种异常(如 stale元素、超时等)。

解决办法

  1. 优化异常日志
    修改catch块代码,修正笔误并输出可读异常信息:

    catch (Exception e) {
        String errorMsg = String.format("Exception in clickNewPurchase(): %s\nStack Trace: %s", 
                                        e.toString(), Arrays.toString(e.getStackTrace()));
        softAssertFail(errorMsg, ValidationType.UI);
        e.printStackTrace();
    }
    
  2. 处理潜在异常场景

    • 针对StaleElementReferenceException:在循环前添加等待元素稳定的逻辑,或在捕获该异常时重新获取元素列表。
    • 针对元素定位问题:检查newPurchase、currentPage定位器是否适配页面动态元素,必要时调整定位策略(如用文本、属性组合定位)。
    • 针对等待超时:延长waitforVisibilityOfElement的超时时间,或确认跳转后的页面元素是否正确对应currentPage定位器。
  3. 优化代码逻辑

    • 增加无匹配按钮的处理分支,避免遍历完列表后无任何操作:
      } else {
          baseClass.logInfo("No matching button found on Start a Purchase page");
          // 可根据需求添加断言或其他处理逻辑
      }
      
    • 提取公共点击方法,减少JavascriptExecutor代码冗余:
      private void clickElement(WebElement element) {
          JavascriptExecutor executor = (JavascriptExecutor)driver.get();
          executor.executeScript("arguments[0].click();", element);
      }
      

内容的提问来源于stack exchange,提问作者Elgun Quliyev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:52:49