我正在尝试运行Selenium测试,它等待直到某个属性具有继续的值,并在浏览器中检查时(代码检查Ctrl + shit + I,ctrl + F),它使用css定位器,但是在运行测试时,我总是会超时-该元素在该时间之前会获得所需的值
我的代码(CMExtensionMethods.IsElementVisible == ExpectedConditions,执行相同的操作):
public static WebDriverWait waitForElement = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
waitForElement.Until(CMExtensionMethods.IsElementVisible(By.CssSelector("#page_progress[style~='display:']")));
public static Func<IWebDriver, IWebElement> IsElementVisible(By identifier) {
return (driver) =>
{
try {
return IfElementVisible(driver.FindElement(identifier));
}
catch(NoSuchElementException) {
return null;
}
};
}
// Part of the method above
private static IWebElement IfElementVisible(IWebElement element) {
return element.Displayed ? element : null;
}
页面上的HTML代码(page_progress样式随网站状态而异-样式为此样式或为空):
<div id="page_progress" class="loading-progress" style="display: none;">
</div>
<div id="page_saveindicator" class="unsaved-changes" style="display:
none;"></div>
期望:样式获得值后立即继续执行的代码
结果:什么都没找到,尽管设置了元素的属性和值,但在5秒(设置)后出现了超时错误
也许值得一提-方法 IsElementVisible 可以工作-在ID和CSSselector上使用类和ID(单独)进行了测试
答案 0 :(得分:0)
在CSS选择器中使用了错误的比较运算符。
~=
运算符必须与属性值完全匹配。
要么添加属性值的block
部分,要么将比较运算符更改为^=
。
By.CssSelector("#page_progress[style^='display:']")
更多信息:https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors
答案 1 :(得分:0)
您不需要(也不应该)在定位器中包含style=display:...
来确定可见性。当您使用.Displayed
或使用ExpectedConditions
并等待可见时,Selenium会为您完成。只需正常定位该元素,例如您的两个元素都有ID,因此请使用By.Id("page_progress")
,例如
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("page_progress"));
而硒将负责其余的工作。