我正在学习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:陈旧元素引用:元素未附加到页面文档中
答案 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”)唯一的元素,然后单击它。