陈旧元素异常Java Selenium

时间:2017-01-13 02:37:48

标签: java selenium web-crawler element expand

我正在尝试抓住旅行顾问的评论。某些评论包含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]", " ");

2 个答案:

答案 0 :(得分:0)

我遇到同样的问题,这是由于有时DOM元素的问题导致异常无法通过selenium访问。 我来这个解决方案,它对我有用。

http://darrellgrainger.blogspot.in/2012/06/staleelementexception.html

答案 1 :(得分:0)

您是否考虑过使用@FindBy注释来声明WebElements?使用此批注,每次调用WebElement时,驱动程序都会在DOM中搜索该WebElement。

此方法意味着您只需要声明每个元素一次,并存储对WebElement的引用。它还允许您使用页面对象模式,这将使您在页面和测试逻辑之间实现清晰的分离。

这是一篇关于它的文章:

https://www.toptal.com/selenium/test-automation-in-selenium-using-page-object-model-and-page-factory