如何实现等待C#中的属性更改的Selenium条件

时间:2017-06-14 11:22:46

标签: c# selenium

我想使用Selenium实现一种方法,该方法轮询HTML元素的某个属性的值,并等待它与给定值不同(在这种情况下,之前的值) 。以下代码是我为此实现的方法。

 private static string waitForAttributeToNotBe(By elementCondition, string attribute, string originalValue)
 {
     Func<IWebDriver, bool> testCondition = (x) => !(x.FindElement(elementCondition).GetAttribute(attribute).Equals(originalValue));

     //Wait is implemented above, as Wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(20));

     Wait.Until(testCondition);

     return Driver.FindElement(elementCondition).GetAttribute(attribute);
 }

这一直在我的构建中工作,但是特定的构建导致了问题,即StaleElementException。

OpenQA.Selenium.StaleElementReferenceException : {"errorMessage":"Element does not exist in cache","request":{#ommitted#}}
  at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
  at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
  at OpenQA.Selenium.Remote.RemoteWebElement.GetAttribute(String attributeName)
  (...)

抛出此异常来评估定义Func的行。

我假设通过提供的条件显式定义FindElement可以避免元素没有被缓存的问题。

我能做些什么来避免这种情况吗?一个更聪明的改述?

谢谢你, JM

2 个答案:

答案 0 :(得分:1)

试试这个。

在Java中 -

WebDriverWait wait = new WebDriverWait(driver, 30); 
wait.until(ExpectedCondition.attributeContains(WebElement element,
                                               java.lang.String attribute,
                                               java.lang.String value));

在C# -

您可以创建自己的自定义预期条件

请参阅此< - strong> https://stackoverflow.com/a/41048165/4193068

答案 1 :(得分:1)

以下是等待属性不同的示例:

string valueBefore = wait.Until(NotAttribute(By.cssSelector(...), "value", ""));
...
string valueAfter = wait.Until(NotAttribute(By.cssSelector(...), "value", valueBefore));
public static Func<IWebDriver, string> NotAttribute(By locator, string attribute, string notValue) {
    return (driver) => {
      try {
          var value = driver.FindElement(locator).GetAttribute(attribute);
          return value == notValue ? null : value;
      }
      catch (NoSuchElementException) {
          return null;
      }
      catch (StaleElementReferenceException) {
          return null;
      }
    };
}