为了账号安全,请及时绑定邮箱和手机立即绑定

Selenium WebDriver如何解决过时的元素参考异常?

Selenium WebDriver如何解决过时的元素参考异常?

慕桂英3389331 2019-08-02 16:31:00
Selenium WebDriver如何解决过时的元素参考异常?我在Selenium 2 Web驱动程序测试中有以下代码,它在我调试时有效,但是当我在构建中运行它时大部分时间都失败了。我知道它必须与页面没有刷新的方式有关,但不知道如何解决它所以任何关于我做错了什么的指针都表示赞赏。我使用JSF primefaces作为我的Web应用程序框架。当我点击添加新链接时,会出现一个弹出对话框,其中包含一个我可以输入日期的输入框,然后单击保存。它是在输入元素输入文本,我得到一个陈旧的元素引用异常。提前致谢import static org.junit.Assert.assertEquals; import java.util.HashMap;import java.util.List;import java.util.Map;import org.junit.Test;import org.openqa.selenium.By;import org.openqa.selenium.StaleElementReferenceException;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.support.ui.ExpectedCondition;import org.openqa.selenium.support.ui.WebDriverWait;public class EnterActiveSubmissionIntegrationTest {Map<String, Map<String, String>> tableData = new HashMap<String, Map<String, String>>();@Testpublic void testEnterActiveSubmission() throws Exception {    // Create a new instance of the Firefox driver    // Notice that the remainder of the code relies on the interface,     // not the implementation.    System.setProperty("webdriver.chrome.driver", "C:/apps/chromedriver.exe");    WebDriver driver = new ChromeDriver();    // And now use this to visit Google    driver.get("http://localhost:8080/strfingerprinting");    // Alternatively the same thing can be done like this    // driver.navigate().to("http://www.google.com");    // Find the text input element by its name    WebElement element = driver.findElement(By.linkText("Manage Submissions"));    element.click();    parseTableData(driver, "form:submissionDataTable_data", 1);    assertEquals(tableData.get("form:submissionDataTable_data").get("12"), "Archived");    WebElement newElement = driver.findElement(By.linkText("Add new"));    newElement.click();
查看完整描述

3 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

首先让我们清楚一下WebElement是什么。

WebElement是对DOM中元素的引用。

当您正在交互的元素被销毁然后重新创建时,抛出StaleElementException。如今,大多数复杂的网页都会随着用户与之交互而动态移动,这需要销毁和重新创建DOM中的元素。

当发生这种情况时,您之前使用的DOM中元素的引用变得陈旧,您不再能够使用此引用与DOM中的元素进行交互。当发生这种情况时,您需要刷新您的参考,或者在现实世界中,再次找到该元素。


查看完整回答
反对 回复 2019-08-02
?
LEATH

TA贡献1936条经验 获得超6个赞

这不是问题。如果将.findElement调用包装在try-catch块中并捕获StaleElementReferenceException,则可以根据需要循环并重试多次,直到成功为止。

以下是我写的一些例子

Selenide项目的另一个例子:

public static final Condition hidden = new Condition("hidden", true) {
    @Override
    public boolean apply(WebElement element) {
      try {
        return !element.isDisplayed();
      } catch (StaleElementReferenceException elementHasDisappeared) {
        return true;
      }
    }
  };


查看完整回答
反对 回复 2019-08-02
  • 3 回答
  • 0 关注
  • 976 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信