首页 > 解决方案 > Selenium 陈旧元素参考

问题描述

(开始的免责声明,我还在学习 Selenium,所以如果这里有任何可怕的不良做法,请告诉我)

我正在尝试使用 Selenium 在字段中输入一些文本,等待结果页面加载,然后获取特定的 DOM 元素。我的输入文本在一个数组中

@Test
public void test() throws Exception {
    final String[] terms = new String[] {"foo", "baz", "bar"};
    for (String term: terms) {
      search(term);
    }
}

private void search(String searchTerm) { 
    driver.get(myPage);
    driver.findElement(By.xpath(xpath)).sendKeys(searchTerm);
    // Press enter
    System.out.println(driver.findElement(By.className("theThingIWant").getText());
    System.out.println(driver.findElement(By.className("anotherThingIWant").getText());
}

显然,这不是所有代码,但为了保持帖子简短,我想提供我正在尝试做的事情的要点。当我运行它时,我偶尔会StaleElementReferenceException从其中一个打印语句中得到一个。这种行为是不确定的:有时它会出现,有时它不会出现并且测试运行成功,当它出现时,它不会同时出现。例如,有时它会在搜索时显示,有时它会baz在搜索时显示bar,有时它会显示在第一个打印语句中,有时会显示在第二个。

我预感到 for 循环运行得太快,导致驱动程序返回myPage并搜索下一个术语,因为我的代码仍在尝试访问theThingIWantanotherThingIWant. 如果我错了,请告诉我,但我非常感谢您尝试解决此问题的一些见解

编辑:注意,当我只运行一个没有 for 循环的搜索元素时,代码工作得很好,例如。search("foo")或者search("baz")会运行得很好

标签: javaselenium

解决方案


正如你所说,问题是因为你的代码没有让浏览器加载网页所需的时间。Thread.sleep(x);必须在每个之后写一个driver.get(myPage);让浏览器加载网页。

如果这对您不起作用,请尝试遵循以下问题的答案:如何避免 Selenium 中的“StaleElementReferenceException”?.


推荐阅读