使用Selenium Webdriver等待更改的最佳做法?

时间:2012-05-03 06:37:09

标签: selenium webdriver

在点击事件之后,我需要等待元素属性更改,然后再继续(点击事件会导致某些元素移出焦点而某些其他元素会通过JS获得焦点)

花了很多时间在webdriver中寻找“waitForAttribute”(selenium 1命令)的可靠替代品之后...我可以得到以下代码。但我不确定这是否是最好的实施....

还有其他更好的解决方案吗?

wait = new WebDriverWait(wedriver1, TimeSpan.FromSeconds(5));
.....
button.Click();
wait.Until(webdriver1 => webdriver2.webelement.GetAttribute("style").Contains("display: block"));

此外,任何人都可以分享一个链接,了解如何使用webdriver处理AJAX事件更改。

5 个答案:

答案 0 :(得分:6)

我建议使用org.openqa.selenium.support.ui.ExpectedConditions.attributeToBe(WebElement element, String attribute, String value)

e.g。

WebDriverWait wait = new WebDriverWait(driver, 5); // time out after 5 seconds
someElement.click();
wait.until(ExpectedConditions.attributeToBe(someElement, "sort-attribute", "ascending"));

docs

答案 1 :(得分:5)

这是Selenium的反复出现的问题。 我不确定现有的“最佳”实施方案。我认为这在很大程度上取决于具体情况。

关于AJAX驱动的更改,我通常会使用waitForElementPresent或waitForElementNotPresent,具体取决于AJAX调用将在页面上进行的更改。

答案 2 :(得分:5)

您可以使用隐式WebDriver等待:

  

driver.manage()。timeouts()。implicitlyWait(10,TimeUnit.SECONDS);

隐式等待是告诉WebDriver在尝试查找一个或多个元素时,如果它们不能立即可用,则会在一定时间内轮询DOM。

更多信息:http://seleniumhq.org/docs/04_webdriver_advanced.html#implicit-waits

答案 3 :(得分:2)

我觉得使用WebDriverWait非常有用。您可以在代码中进行一项更改 -

webelement.isDisplayed(); 

而不是获取样式属性。

答案 4 :(得分:0)

您可以像人们已经实现here.一样使用Thread.sleep。您可以使用他们的实现来解决您的问题。

    public void waitFor(Webdriver driver,,WebElement welElem, String attributeValue){
    int timeout=0;
    while(true){
        if(driver.webElem.getAttribute(attribute)!=null){
        break;
        }
        if(timeout>=10){
        break;
        }
        Thread.sleep(100);
        timeout++;
    }

}

我认为你可以实现这样的东西。我没有检查过,但你明白了。