2

我在 C# 中使用 Selenium 2 WebDriver 来自动化输入页面。加载 DOM 时隐藏了一个验证摘要控件。这是它在额外负载下的外观。

<div id='validation_summary' style='display: none'>
  <div id='validation_message'/>

当我的 pageObject 在 Selenium 中初始化时,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 反映我的变化。

4

2 回答 2

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 实现自己的工具。

于 2012-08-31T16:48:17.703 回答
0

是的,我的回答是使用 Java 伪代码,但是 Selenium 足够聪明,可以始终获取最新版本的元素。在此循环期间,WebElement 实例将继续自我刷新,因此它不会过时:

@FindBy( id = 'validation_message')
public WebElement validatorMessageElement;
...
PageFactory.initObjects()
...
for ( infiniteLoop ) {
   boolean isThere = validatorMessageElement.isDisplayed();
   sleep(1 second);
}
于 2016-02-20T00:11:39.183 回答