Selenium Webdriver等待变化的最佳实践是什么?

16
在点击事件后,我需要等待一个元素的属性改变后才能继续进行(点击事件会导致某些元素失去焦点,并且通过JS使某些其他元素获得焦点)。
在寻找可靠替代"waitForAttribute"(selenium 1命令)的过程中,我能够让以下代码工作。但我不确定这是否是最佳实现...
有其他更好的解决方案吗?
wait = new WebDriverWait(wedriver1, TimeSpan.FromSeconds(5));
.....
button.Click();
wait.Until(webdriver1 => webdriver2.webelement.GetAttribute("style").Contains("display: block"));

还有,可否请问有人能分享一下如何使用Webdriver处理AJAX事件变化的链接。


http://assertselenium.com/2013/01/29/webdriver-wait-commands/有一个很好的清单,列出了可能的等待方法及其相关性。 - Pat
@Pat:assertselenium.com网站似乎已经消失了。 - Vince Bowdren
1
该页面的存档版本:http://web.archive.org/web/*/http://assertselenium.com/2013/01/29/webdriver-wait-commands/ - Pat
5个回答

9

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

例如:

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

(docs)


6

这是Selenium经常出现的问题。我不确定是否存在“最佳”实现,我认为这主要取决于具体情况。

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


3
这样做是可行的,但只适用于元素出现/消失的情况。有许多情况下,元素仍然可见但会更改属性,我认为提问者想要的是这种情况,而这些方法并不涵盖。 - Vince Bowdren

4

1
抱歉,我认为你没有理解我的问题。我的元素属性会在点击事件(由JS驱动)上更改。我不明白隐式等待在这里有什么用处。据我理解,隐式等待更适用于事件后元素可见的情况。 - Kir

2

我认为使用WebDriverWait非常有用。你可以在代码中进行一些更改 -

webelement.isDisplayed(); 

不要获取 style 属性,而是使用 CSS 样式。


0

你可以像其他人实现的这里一样使用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++;
    }

}

我认为你可以实现类似这样的东西。我没有检查过,但你可以理解这个想法。


2
我相信整个while循环就是我上面发布的“wait.Until”所做的事情。因此,我不明白为什么要编写这个显式的while循环。我认为我的实现更加简洁,而且也能正常工作。 - Kir
1
当(timeout<10)时,删除if语句。只是对你的代码的一个注释。 - Aleh Douhi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接