Selenium 2 WebDriver未按预期评估更新的DOM

时间:2012-08-24 00:03:38

标签: c# javascript selenium pageobjects

我在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反映的变化。

2 个答案:

答案 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);
}