You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于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

火山引擎 最新活动