硒陈旧元素参考

时间:2020-03-13 22:39:11

标签: java 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")可以正常运行

1 个答案:

答案 0 :(得分:0)

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

如果这对您不起作用,请尝试遵循以下问题的答案:How to avoid "StaleElementReferenceException" in Selenium?