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

Kir*_*Kir 14 c# 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"));
Run Code Online (Sandbox Code Playgroud)

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

jer*_*nja 7

我建议使用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"));
Run Code Online (Sandbox Code Playgroud)

(docs)


Sil*_*ier 6

这是Selenium的反复出现的问题.我不确定现有的"最佳"实施方案.我相信这在很大程度上取决于具体情况.

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

  • 这将起作用,但仅适用于元素出现/消失的情况.在很多情况下,元素仍然可见,但更改了属性,我认为OP要求这些属性,这些方法没有涵盖. (3认同)

Man*_*ngh 5

您可以使用隐式WebDriver等待:

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

隐式等待是指在尝试查找一个或多个元素(如果它们不是立即可用)时,WebDriver轮询DOM一段时间.

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