SeleniumはすべてのXPath要素を評価できますか?
質問
Seleniumは特定の XPath
に一致する可能性のあるすべての要素を評価できますか?
たとえば、すべてのチェックボックスが // input [type = 'checkbox']
でチェックされているかどうかを評価したいのですが、問題は1つだけです要素が返されました。
解決
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 + "]"));
}
他のヒント
上記のアプローチを試してみましたが、セレンは要素が見つからないという例外をスローしていました。プレフィックスxpath =を追加すると問題が解決しました。
例
xpath=(//td[@class='cell name bold'])[1]
xpath=(//td[@class='cell name bold'])[2]
と
/descendant::input[@type='text'][1]
/descendant::input[@type='text'][2]
ツリー内の all 入力要素のみを検索できます。サブツリーを解析するだけでは機能しません。
より良い方法は次のとおりです。
(/form/div/input[@type='text'])[1]
(/form/div/input[@type='text'])[2]
括弧内のXPath式の結果#1、#2などを返します。
もちろんできます
(//input[@type='text'])[1]
Seleniumは最初の一致を使用するだけで、XPathが通常返す結果セットを処理できないため、これは非常に便利です。
ロケータから返されたアイテムのリストをSeleniumが評価する方法はありません。 最初の1つを取得し、それだけで処理します。
Dave answerは、探しているものの最良の代替手段です。
Seleniumでまったく同じことをしようとしていますが、@ dave-huntの例を使用してみましたが、コレクション内の個々の要素を見つけるには不適切な方法です。
次の例を検討してください:
<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]
最初の式は最初の入力を取得し、2番目の式は2番目の入力を取得します。単一の&quot; /&quot;を使用することが非常に重要です。二重の&quot; //&quot;ではありません。