扫码关注官方订阅号
我正在使用Java实现很多Selenium测试 - 有时候,我的测试由于StaleElementReferenceException而失败。
StaleElementReferenceException
你能提供一些使测试更稳定的方法吗?
我曾经遇到这个问题,但是不知道的是,页面上运行了BackboneJS,并且替换了我试图点击的元素。我的代码如下。
driver.findElement(By.id("checkoutLink")).click();
这当然在功能上与下面的代码相同。
WebElement checkoutLink = driver.findElement(By.id("checkoutLink")); checkoutLink.click();
偶尔会发生的情况是,在查找和点击之间,javascript会替换checkoutLink元素,即。
WebElement checkoutLink = driver.findElement(By.id("checkoutLink")); // javascript替换了checkoutLink checkoutLink.click();
这就导致在尝试点击链接时出现StaleElementReferenceException异常。我找不到任何可靠的方法告诉WebDriver等待javascript运行完毕,所以这是我最终解决的方法。
new WebDriverWait(driver, timeout) .ignoring(StaleElementReferenceException.class) .until(new Predicate<WebDriver>() { @Override public boolean apply(@Nullable WebDriver driver) { driver.findElement(By.id("checkoutLink")).click(); return true; } });
这段代码将不断尝试点击链接,忽略StaleElementReferenceException异常,直到点击成功或达到超时时间。我喜欢这个解决方案,因为它省去了编写重试逻辑的麻烦,并且只使用了WebDriver的内置构造。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
我曾经遇到这个问题,但是不知道的是,页面上运行了BackboneJS,并且替换了我试图点击的元素。我的代码如下。
driver.findElement(By.id("checkoutLink")).click();这当然在功能上与下面的代码相同。
WebElement checkoutLink = driver.findElement(By.id("checkoutLink")); checkoutLink.click();偶尔会发生的情况是,在查找和点击之间,javascript会替换checkoutLink元素,即。
WebElement checkoutLink = driver.findElement(By.id("checkoutLink")); // javascript替换了checkoutLink checkoutLink.click();这就导致在尝试点击链接时出现StaleElementReferenceException异常。我找不到任何可靠的方法告诉WebDriver等待javascript运行完毕,所以这是我最终解决的方法。
new WebDriverWait(driver, timeout) .ignoring(StaleElementReferenceException.class) .until(new Predicate<WebDriver>() { @Override public boolean apply(@Nullable WebDriver driver) { driver.findElement(By.id("checkoutLink")).click(); return true; } });这段代码将不断尝试点击链接,忽略StaleElementReferenceException异常,直到点击成功或达到超时时间。我喜欢这个解决方案,因为它省去了编写重试逻辑的麻烦,并且只使用了WebDriver的内置构造。