2009-03-16 7 views
35

Seleniumを使用していくつかのテストを作成しようとしているGWTアプリケーションがあります。XPathを使用して可視要素のみを選択するにはどうすればよいですか?

私はXPathを使用して、テストのためにページ上の要素を識別しています。 idを使用すると、idの値がGWTによって自動生成され、変更される可能性があります。

しかし
//button[.='OK'] 

、私は問題を抱え始めた複数のテストを実行し始めたとき:物事は、私は次のように私は彼らのラベルでボタンを見つけることができる実現したときにうまく行き始めました。私は、この問題は、Javascriptによって生成されたGWTアプリのすべての異なる「ページ」が隠された<div>要素のHTMLに残っていることに気付きました。これは、現在のビューで表示されているボタンの代わりに、自分のセレンテストで隠されたボタンがクリックされることを意味していました。

FirebugでHTMLを調べると、style属性にdisplay: noneを追加すると、GWTは<div>要素を隠しているようです。これは、次のように私はすべての隠されたOKボタンを見つけることができます意味:

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

これはstyledisplay: noneを持つことによって隠されている祖先<div>を持っているのボタンすなわち、すべての隠されたOKボタンを、見つけるでしょう。

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

答えて

46

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

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

EDIT:

シンプルでより効率的な発現を下回る:

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

正常に動作しないすべてのボタンが表示さだ少なくとも一つのdivを持っているので、その先祖の中で。

+0

があります。どうもありがとう。 –

+1

DOMツリーに隠されていない別のdivがある場合、最後の1つは機能しません:

Fortega

+0

@Fortegaとその周辺のテキストで言われています –

12

Selenium 2 Webdriverは、この問題を扱うisDisplayed()メソッドのオプションを提供します。セレンの貢献者の素晴らしい仕事。

+1

display hidden属性が親要素であり、要素自体ではない場合は機能しますか? –

+2

はい、特定の要素についてこれをチェックする必要があります。コレクション全体に一致することはできません。 – sitnarf

+1

これは、取得( 'find by *')と 'isDisplayed()'を使って可視性をチェックする間に要素が変更されたときに、 'StaleElementReferenceException'例外が発生する可能性があるので注意してください。 – Blaise

-3
//div[contains(@style,'display: block')] 

このコードはこれだけです目に見える要素のxpath

関連する問題