【问题标题】:Best practice to wait for a change with Selenium Webdriver?等待 Selenium Webdriver 更改的最佳实践?
【发布时间】:2019-09-06 13:25:25
【问题描述】:

在点击事件之后,我需要等待元素属性发生变化,然后再继续(点击事件导致某些元素移出焦点,而某些其他元素通过 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 事件更改的链接。

【问题讨论】:

标签: c# selenium webdriver


【解决方案1】:

我建议使用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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这将起作用,但仅适用于元素出现/消失的情况。在许多情况下,元素保持可见但更改了属性,我认为这是 OP 要求的,这些方法没有涵盖。
    【解决方案3】:

    您可以使用隐式 WebDriver 等待:

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

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

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

    【讨论】:

    • 抱歉,我认为您没有理解我的问题。我的元素属性在单击事件(由 JS 驱动)上发生变化。我看不出隐式等待在这里有什么用。据我了解,如果元素在事件之后可见,则隐式等待更为相关。
    【解决方案4】:

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

    webelement.isDisplayed(); 
    

    而不是获取样式属性。

    【讨论】:

      【解决方案5】:

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

          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++;
          }
      
      }
      

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

      【讨论】:

      • 我相信整个 while 循环就是我在上面发布的“wait.Until”所做的。所以我看不出写这个显式的while循环的意义。我想我正在运行的实现要干净得多
      • while(timeout<10) 并删除 if 语句。只是对您的代码的注释。
      猜你喜欢
      • 2014-05-11
      • 2013-02-02
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      相关资源
      最近更新 更多