我在C#中使用Selenium 2 WebDriver来自动化输入页面。有一个验证摘要控件在加载DOM时隐藏。以下是它在额外负载上的表现。
<div id='validation_summary' style='display: none'>
<div id='validation_message'/>
在Selenium中初始化我的pageObject时,WebElement的Displayed属性设置为'false'。这是我所期待的。
单击提交按钮后,dom将更改为:
<div id='validation_summary' style='display: block'>
<div id='validation_message'>
<div><a>Fix Me</a></div>
</div>
当我尝试以下列方式访问WebElement时,在发出单击验证后,Displayed属性仍为“false”,并且附加的div不可见:
var validation = new WebDriverWait(_driver, TimeSpan.FromSeconds(10)).Until<IWebElement>((d)=>d.FindElement(By.Id('validation_message'));
这真的有效吗?我是否应该期待Selenium足够精明以在当前状态下评估DOM?它如何实际评估元素的Displayed属性?如果我查看PageSource属性,我确实看到文本存在。我不明白为什么我看不到Selenium反映的变化。
答案 0 :(得分:2)
试试这个:
var scripter = driver as JavaScriptExecutor;
var result = scripter.ExecuteScript("return $('#validation_message').is(':hidden');").ToString();
if (result.ToLower().Equals("true"))
{
//Do your stuff
}
不要害羞使用javaScript。据我所知,Selenium仍然没有足够的工具,所以你可以使用javaScript实现自己的工具。
答案 1 :(得分:0)
是的,我的回答是使用Java伪代码,但Selenium非常聪明,可以随时获取该元素的最新版本。在此循环期间,WebElement实例将继续刷新自身,因此它不会陈旧:
@FindBy( id = 'validation_message')
public WebElement validatorMessageElement;
...
PageFactory.initObjects()
...
for ( infiniteLoop ) {
boolean isThere = validatorMessageElement.isDisplayed();
sleep(1 second);
}