我正在尝试抓取旅行顾问评论。某些评论具有more
链接,单击该链接时会显示评论的整个文本。但是,当我使用Selenium模仿点击时,DOM会发生变化,这给了我Stale Element Exception
。我正在尝试通过再次获取 DOM 来解决它,但错误仍然存在。我哪里出错了?
List reviews = driver.findElements(By.className("review"));
for (int x = 0; x < reviews.size(); x++) {
WebElement element = driver.findElements(By.className("review")).get(x);
try {
if (element.findElements(By.className("expandLink")).size() > 0)
if (element.findElement(By.className("expandLink")).findElement(By.className("ulBlueLinks")).getText().startsWith("More")) {
element.findElement(By.className("ulBlueLinks")).click();
if (driver.findElements(By.className("ui_overlay")).size() > 0)
driver.findElement(By.className("ui_overlay")).findElement(By.className("ui_close_x")).click();
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
while (driver.findElements(By.className("ui_close_x")).size() > 0)
driver.findElement(By.className("ui_close_x")).click();
element = driver.findElements(By.className("review")).get(x);
String rating = element.findElement(By.className("ui_bubble_rating")).getAttribute("class").split(" ")[1].replaceAll("bubble_", "");
String review = element.findElement(By.className("entry")).getAttribute("innerHTML").replaceAll("<[^>]*>", "").replaceAll("[,n]", " ");
我遇到了同样的事情,这是由于有时硒无法访问的 DOM 元素出现问题导致异常。我提供了这个解决方案,它对我有用。
http://darrellgrainger.blogspot.in/2012/06/staleelementexception.html
您是否考虑过使用 @FindBy 注释来声明 WebElements?使用此注释,每次调用 WebElement 时,驱动程序都会在 DOM 中搜索该 WebElement。
此方法意味着您只需声明每个元素一次,并存储对 WebElement 的引用。它还允许您使用页面对象模式,这将使页面和测试逻辑之间完全分离。
这是关于它的文章:
https://www.toptal.com/selenium/test-automation-in-selenium-using-page-object-model-and-page-factory