关于Selenium中Stale Element Exception(过时元素异常)处理方法的技术问询
关于Selenium中Stale Element Exception(过时元素异常)处理方法的技术问询
嘿,最近在做Selenium自动化测试的时候(就像我写的AddEmployeeTest这类带DataProvider的测试用例),被**Stale Element Exception(过时元素异常)**折腾得够呛,试了几种办法还是偶发这个问题,想请教下各位有没有更靠谱的处理思路?先把我的部分测试代码和遇到的场景说清楚:
我用TestNG的DataProvider批量跑员工添加的测试用例,代码片段如下:
import java.time.LocalDate; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class AddEmployeeTest extends BaseTest { @DataProvider(name = "employeeData") public Object[][] getEmployeeData() { return new Object[][] { { "John", "S", "Doe" }, { "Jane", "M", "Smith" }, { "Thomas", "Alva", "Edison" } }; } // 测试方法,循环用DataProvider的数据添加员工 @Test(dataProvider = "employeeData") public void testAddEmployee(String firstName, String middleName, String lastName) { // 这里会先定位添加按钮、输入框等元素 WebElement addEmpBtn = driver.findElement(By.id("addEmpBtn")); addEmpBtn.click(); // 输入员工信息 WebElement firstNameInput = driver.findElement(By.id("firstName")); firstNameInput.sendKeys(firstName); // ... 其他输入操作 // 提交后页面刷新回到员工列表 driver.findElement(By.id("submitBtn")).click(); // 这时候要验证员工是否添加成功,定位列表元素时就经常抛出StaleElementReferenceException WebElement newEmployee = driver.findElement(By.xpath("//td[text()='" + firstName + " " + lastName + "']")); Assert.assertTrue(newEmployee.isDisplayed()); } }
具体场景是:每次提交员工信息后,页面会刷新或者通过AJAX更新DOM结构,这时候之前定位的元素(比如列表里的元素)就失效了,哪怕我重新定位,偶尔还是会触发这个异常。我自己试了直接重新定位元素,但偶发的情况还是解决不了,想问问大家有没有通用的处理技巧?比如有没有办法自动重试?或者有没有什么等待策略能避免这个问题?
我自己整理了几个可能的方向,但不确定是不是最优的:
- 每次需要操作元素前都重新定位,绝不提前缓存WebElement对象
- 用WebDriverWait的
ExpectedConditions.refreshed()方法来等待元素 - 封装一个带重试逻辑的工具方法,捕获到异常就重新定位再操作
想听听大家的实际经验,有没有更稳妥的办法?
备注:内容来源于stack exchange,提问作者Darshan Hegde




