Selenium添加表格数据后断言触发StaleElement异常如何处理?
问题根因
- 你定义的
listOfJobs是静态成员变量,仅在类初始化时执行一次driver.findElements查找元素,后续页面DOM因为新增数据、刷新发生变更后,之前缓存的WebElement引用全部失效,就会触发StaleElementReferenceException。 - 额外隐藏问题:
listOfJobs()方法里List<String> jobs直接初始化为null,调用add方法会抛出空指针异常。
修复方案
1. 去除静态元素缓存,每次调用都重新查找元素
修改OrangeHRMAddJobCategories类的元素获取逻辑,取消静态变量缓存,每次调用getListOfJobs都实时从当前DOM查询最新元素:
// 移除原来静态缓存的listOfJobs变量,直接在方法内实时查询 public static List<WebElement> getListOfJobs() { try { return driver.findElements(By.xpath("//*[@id='resultTable']//tbody/tr//a")); } catch (Exception e) { e.printStackTrace(); } return Collections.emptyList(); }
2. 修正listOfJobs方法的空指针问题
public static List<String> listOfJobs() { List<String> jobs = new ArrayList<>(); // 初始化为空ArrayList,不要赋值为null for (WebElement jobElement : OrangeHRMAddJobCategories.getListOfJobs()) { jobs.add(jobElement.getText()); } return jobs; }
3. 新增数据后增加显式等待(可选优化,避免页面未渲染完成就校验)
保存任务分类后、执行断言前增加等待逻辑,避免DOM还没更新完就执行校验:
OrangeHRMAddJobCategories jobCategories = new OrangeHRMAddJobCategories(); // 先存储生成的分类名,避免重复调用生成方法导致值不一致 String categoryName = UsefulFunctionUtils.generateName(); jobCategories.clickJobTab().clickJobCategoires().clickAdd().setJobCategoryName(categoryName).saveJobCategory(); // 显式等待5秒,直到表格中出现新增的分类名称 new WebDriverWait(driver, Duration.ofSeconds(5)) .until(ExpectedConditions.textToBePresentInElementLocated(By.id("resultTable"), categoryName)); Assertions.assertThat(UsefulFunctionUtils.listOfJobs().contains(categoryName));
内容的提问来源于stack exchange,提问作者enthusiasticCoder
相关产品推荐
相关产品推荐

