我想使用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
答案 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;
}
};
}