等待元素变得陈旧,为什么'ExpectedConditions.stalenessOf'没有工作?

时间:2017-02-08 16:38:52

标签: java selenium selenium-webdriver webdriver

我创建了以下方法:

public void waitAndClickElement(WebElement element) throws InterruptedException {
    try {
        Boolean elementPresent = this.wait.until(ExpectedConditions.elementToBeClickable(element)).isEnabled();
        if (elementPresent == true && element.isDisplayed()) {
            element.click();
            System.out.println("Clicked on the element: " + element.getText());
        }
    } catch (StaleElementReferenceException elementUpdated) {
        Boolean elementPresent = wait.until(ExpectedConditions.stalenessOf(element));
        if (elementPresent == true) {
            WebElement staleElement = element;
            staleElement.click();
            System.out.println("Clicked on the 'Stale' element: " + element.getText());
        }
    } catch (NoSuchElementException e) {
        System.out.println("Exception! - Could not click on the element: " + element.getText() + ", Exception: "+ e.toString());
        throw (e);
    } finally {
    }
}

但我似乎仍然得到以下例外情况:

预期条件失败:等待元素(代理元素:DefaultElementLocator'By.xpath:// [text()='立即交换»']')变得陈旧(尝试20秒,500秒) MILLISECONDS间隔) enter image description here

但同样的方法可以说20个版本中的18个,任何想法?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

如果您使用其他driver.get("http://completely.different.site.com/");更改网站,则此元素将过时(不再在DOM中)。陈旧性意味着DOM中的元素无法访问。

答案 1 :(得分:1)

你的问题的直接答案是你正在等待已经陈旧的元素变得陈旧。我不确定你的意图是什么。

您的功能过于复杂,并且无法按照您的想法行事。

如果某个元素是可点击的,它也会启用并显示,因此您无需检查这三个元素。如果该元素正在抛出StaleElementReferenceException,那么它将不会成为" unstale。"

我建议您使用以下内容替换当前功能。

public void waitAndClickElement(By locator)
{
    try
    {
        this.wait.until(ExpectedConditions.elementToBeClickable(locator)).click();
    }
    catch (TimeoutException e)
    {
        System.out.println("Count not click element <" + locator.toString() + ">");
    }
}

传递定位器而不是元素而不是元素本身,这将简化很多事情。如果元素存在且可单击,则将单击该元素。如果它不存在或永远不会变为可点击,它将抛出你可以捕获的TimeoutException

此外,编写element.toString()将为元素编写一些ID,这些ID不会是人类可读或有意义的。你最好写locator.toString(),它会返回定位器的类型,例如: By.cssSelector: #hplogo