将Java流与Selenium Webdriver一起使用时,陈旧元素异常

时间:2019-06-22 01:53:43

标签: selenium-webdriver java-8

我正在学习Selenium,并且正在尝试一项练习,必须在Calendar中选择一个特定的日期。我首先在列表中收集按类名筛选出的所有Web元素,然后尝试使用Streams API以所需的日期为条件对其进行迭代,然后尝试单击它。我可以成功选择日期,但之后立即在控制台中看到过时的元素异常。

我读过一些其他的文章,他们暗示它可能因为元素被销毁然后重新创建而变得过时了,我的另一个问题是为什么有人想要这样做,销毁和重新创建的好处是什么? ?我尝试做driver.navigate()。refresh(),但没有帮助。

driver.get("https://www.path2usa.com/travel-companions");

driver.findElement(By.name("travel_date")).click();

List<WebElement> elements = driver.findElements(By.className("day"));

System.out.println(elements.size());

elements.stream().forEach(p -> {
        if (p.getText().equalsIgnoreCase("24")) {
            p.click();}
    });

预期:应该选择日期,此后在Eclipse控制台中不会引发任何错误。

实际:线程“ main”中的异常org.openqa.selenium.StaleElementReferenceException:陈旧元素引用:元素未附加到页面文档中

1 个答案:

答案 0 :(得分:0)

问题与forEach函数的用法有关。

这就是现在的工作方式:

driver.findElement(By.name("travel_date")).click();

->这将打开日期选择器。

现在

driver.findElements(By.className("day"));

->返回42

elements.stream().forEach(p -> {
        if (p.getText().equalsIgnoreCase("24")) {
            p.click();}
    });

->一旦找到getText()。equalsIgnoreCase(“ 24”)所在的元素,如果您在UI中注意到,则日期选择器将关闭,并且所选日期将出现在文本框中。现在,对于下一次迭代,由于日期选择器未打开,p.getText()将导致过期。

您应该做的是

elements.stream().filter(e -> e.getText().equalsIgnoreCase("24")).findAny().get().click();

->这将过滤getText()。equalsIgnoreCase(“ 24”)唯一的元素,然后单击它。