2

入力ページを自動化するために 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 に反映されない理由がわかりません。

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 に答える