2009-09-10 10 views
10

Seleniumは、特定のXPathと一致する可能性のあるすべての要素を評価できますか?セレンはすべてのXPath要素を評価できますか?

例えば、のチェックボックスがすべて//input[type='checkbox']でチェックされているかどうかを評価したいと思います。問題は返された要素が1つしかないことです。

答えて

11

getXpathCountコマンドを使用して、一致する要素の数を判断できます。インクリメントを使用してループして、各要素を個別に見つけることができます。以下のJava(TestNGの/ JUnitの)の例では、ページ上のすべてのチェックボックスがチェックされていることを確認します:

int totalCheckboxes = session().getXpathCount("//input[@type='checkbox']").intValue(); 
for (int i = 1; i < totalCheckboxes+1; i++) { 
    assertTrue(session().isChecked("//input[@type='checkbox'][" + i + "]")); 
} 
+0

おかげデイブ、サンティ。私の問題は、単体テストでSeleniumクライアントを使用するオプションがないことです。残念ながら、私はSelenium IDEとコマンドテーブルを使用することに専念していますが、同じことをするためにいくつかのJSを挟むことはできません。 –

+1

JavaScriptを使用してIDEで解決する場合は、ソリューションを提出してください。私はそれを見ることに興味があるだろう。 :) –

2

セレンはロケータによって返された項目のリストを評価することができる方法はありません。 それはちょうど最初のものをつかんで、それでそれのものですか?

あなたが探しているものに最適なのは、Daveの回答です。

+0

私はそれがまだJSの行くのに値すると思う:) –

2

私はセレンでまったく同じことをやろうとしているとデイブ・狩りの例@使用してみましたが、それは、コレクション内の個々の要素を見つけるための間違った方法ですしています。

は、次の例を考えてみましょう:

<form> 
<div> 
    <input type="text" name="field1" /> 
</div> 
<div> 
    <input type="text" name="field2" /> 
</div> 
</form> 

あなたのような式を使用する場合:

//input[@type='text'][1] 

これはページ内のすべてのテキスト入力を返します。どうして?各入力は、それ自身のツリー内で最初に一致する要素であるためです。あなたのような表現を使用する場合

しかし、:

/descendant::input[@type='text'][1] 

または

/descendant::input[@type='text'][2] 

最初の式は、第1の入力をつかむし、第二の発現は、第2の入力をつかむだろう。あなたが「//」ダブル「/」シングルおよびNOTを使用することが非常に重要です。あなたが唯一のツリー内のすべての入力要素を検索することができます

/descendant::input[@type='text'][1] 
/descendant::input[@type='text'][2] 

4

。あなただけのサブツリーを解析したい場合は動作しません。

良い方法である:結果#1、括弧内のXPath式の#2等が返され

(/form/div/input[@type='text'])[1] 
(/form/div/input[@type='text'])[2] 

もちろん、あなたはまた、セレンはちょうど最初の一致を使用し、XPathは通常返すものです結果セットを扱うことができないよう

(//input[@type='text'])[1] 

これは非常に便利です行うことができます。

5

Iは、上記のアプローチ及びセレン元素が検出されない例外をスローした試みました。接頭辞xpathを追加する=問題を解決しました。

xpath=(//td[@class='cell name bold'])[1] 
xpath=(//td[@class='cell name bold'])[2] 
+0

接頭辞 'xpath ='は私の日を救った!感謝万円! –

関連する問題