如何处理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()); }
异常原因分析
- 日志输出错误:catch块中直接用
Arrays.toString(e.getStackTrace())输出堆栈数组,导致显示的是对象内存地址而非可读的异常详情,无法直接定位具体异常类型和触发位置。同时代码存在笔误:错误信息里写的是clickNewQuote(),实际方法是clickNewPurchase()。 - 潜在异常场景:
createElements(newPurchase)获取元素列表时,可能因定位器失效、元素未加载完成抛出异常element.getAttribute("value")可能因页面跳转/刷新导致元素过期,抛出StaleElementReferenceExceptionwaitforVisibilityOfElement(currentPage)等待元素可见时,可能因超时或定位器错误抛出异常- 页面跳转成功不代表代码流程无异常,只是异常被catch块捕获,未阻断页面操作
问题定位方法
- 修复日志输出:将catch块中的异常信息改为
e.toString()或拼接完整堆栈详情,获取可读的异常类型和调用链。 - 增加关键步骤日志:在
createElements、getAttribute、waitforVisibilityOfElement等步骤前后添加日志,明确异常触发环节。 - 捕获具体异常类型:在catch块中打印
e.getClass().getName(),精准定位是哪种异常(如 stale元素、超时等)。
解决办法
优化异常日志
修改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(); }处理潜在异常场景
- 针对
StaleElementReferenceException:在循环前添加等待元素稳定的逻辑,或在捕获该异常时重新获取元素列表。 - 针对元素定位问题:检查
newPurchase、currentPage定位器是否适配页面动态元素,必要时调整定位策略(如用文本、属性组合定位)。 - 针对等待超时:延长
waitforVisibilityOfElement的超时时间,或确认跳转后的页面元素是否正确对应currentPage定位器。
- 针对
优化代码逻辑
- 增加无匹配按钮的处理分支,避免遍历完列表后无任何操作:
} 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
相关产品推荐
相关产品推荐

