16

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

在花时间在 Web 驱动程序中寻找“waitForAttribute”(selenium 1 命令)的可靠替代方案之后......我可以让下面的代码工作。但我不确定这是否是最好的实现......

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

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

另外,任何人都可以分享我如何使用 webdriver 处理 AJAX 事件更改的链接。

4

5 回答 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"));

文档

于 2016-09-15T20:44:37.937 回答
6

这是 Selenium 反复出现的问题。我不确定是否存在“最佳”实现。我相信这在很大程度上取决于情况。

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

于 2012-05-03T06:48:41.343 回答
4

您可以使用隐式 WebDriver 等待:

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

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

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

于 2012-05-04T17:37:52.700 回答
2

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

webelement.isDisplayed(); 

而不是获取样式属性。

于 2012-05-07T04:20:28.550 回答
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++;
    }

}

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

于 2012-05-04T11:17:49.590 回答