web-dev-qa-db-ja.com

XPathを使用して表示要素のみを選択するにはどうすればよいですか?

[〜#〜] gwt [〜#〜] アプリケーションがあります。このアプリケーションでは、 Selenium を使用していくつかのテストを記述しようとしています。

XPathを使用して、テスト用のページ上の要素を識別しています。 idの値はGWTによって自動生成され、変更される可能性があるため、idを使用しても機能しません。次のようにラベルでボタンを見つけることができることに気付いたとき、物事はうまくいき始めました:

//button[.='OK']

しかし、複数のテストを実行し始めたとき、問題が発生し始めました。この問題は、Javascriptによって生成されたGWTアプリのすべての異なる「ページ」が非表示の<div>要素のHTMLに残っていることであることに気付きました。つまり、Seleniumテストでは、現在のビューに表示されているボタンではなく、非表示のボタンがクリックされることがありました。

Firebug でHTMLを調べると、GWTは<div>style属性に追加することでdisplay: none要素を隠しているようです。つまり、次のようにすべての非表示の[OK]ボタンを見つけることができます。

//div[contains(@style,'display: none')]//button[.='OK']

これにより、すべての非表示のOKボタン、つまり<div>styleに持つことで非表示にされる祖先display: noneを持つボタンが見つかります。

私の質問は次のとおりです。XPathを使用して、表示されている[OK]ボタンのみを検索するにはどうすればよいですか。 style<div>を持つ祖先display: none要素のないボタンを見つけるにはどうすればよいですか?

45
Dave Webb

これは動作するはずです:

.//button[.='OK' and not(ancestor::div[contains(@style,'display:none')])
and not(ancestor::div[contains(@style,'display: none')])]

編集:

以下のより単純で効率的な式:

//div[not(contains(@style,'display:none'))]//button[.='OK']

すべてのボタンには祖先に表示されるdivが少なくとも1つあるため、正常に機能しません。

55
Julian Aubourg

Selenium 2 Webdriverには、この問題を処理するisDisplayed()メソッドのオプションがあります。セレンの貢献者による素晴らしい仕事。

12
Hari Reddy

//div[(contains(@style,'display: block'))]//button[@id='buttonid']

これは私のために働いた。 'display: none'非表示ブロックを表す、'display: block'は現在表示されているブロックを表し、上記のように識別する内部タグを指定できます。

0
Vinitha V