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
并搜索下一个术语,因为我的代码仍在尝试访问theThingIWant
或anotherThingIWant
. 如果我错了,请告诉我,但我非常感谢您尝试解决此问题的一些见解
编辑:注意,当我只运行一个没有 for 循环的搜索元素时,代码工作得很好,例如。search("foo")
或者search("baz")
会运行得很好
解决方案
正如你所说,问题是因为你的代码没有让浏览器加载网页所需的时间。Thread.sleep(x);
必须在每个之后写一个driver.get(myPage);
让浏览器加载网页。
如果这对您不起作用,请尝试遵循以下问题的答案:如何避免 Selenium 中的“StaleElementReferenceException”?.
推荐阅读
- go - Golang ICMP 数据包发送
- c# - 异常上的 JsonConvert.SerializeObject 丢失消息
- python - pyspark编程中的日期值比较
- c# - System.InvalidCastException:'无法将'System.String'类型的对象转换为'Newtonsoft.Json.Linq.JToken'类型。'
- javascript - 结合用于邮政信箱的 HTML 5 输入模式和地址特殊字符不允许
- docker - Azure DevOps 服务器 (onprem) - 容器作业 - 结帐不起作用
- mongodb - 如何在 MongoDB 中编写查询以滚动获取过去 7 天的数据
- python - 为什么在 Ubuntu 18.04 上运行 Selenium chrome 驱动程序时 chrome 浏览器不启动
- uri - 区分电子邮件地址和 IRI
- flutter - 有没有办法在 Flutter/Dart 中添加导航路线列表?