Selenium RC ロケーター - 後続の要素を参照しますか?
-
06-09-2019 - |
質問
ページ内に同じロケーターを持つ要素が複数ある場合、次の要素はどのように参照すればよいでしょうか?
Xpath ロケーターを使用すると、配列表記を追加できます。xpath =(// span/div)[1]しかし、単純なロケーターがいますか?
たとえば、「link=Click Here」で識別されるリンクが 3 つある場合、[3] を追加するだけでは 3 番目の要素は取得されません。
そして、要素の配列をアドレス指定するための信頼できるリファレンスはどこにあるのでしょうか?何も見つかりませんでした。
解決
セレンは、それ自体で、ロケータの配列を処理しません。それはちょうどあなたのクエリを満たす最初の要素を返すので、あなたがそれをしたい場合、あなたは、XPath、DOMまたはを使用していても良く、CSSます。
リンクたとえばあなたが使用する必要がありますのでます:
selenium.click("css=a:contains('Click Here'):nth-child(3)")
他のヒント
Selenium は指定したロケーターに一致する最初の要素を返すため、使用するロケーター タイプの適切な式を適用する必要があるという Santi の指摘は正しいです。ただし、この場合、詳細は「悲惨な詳細":
CSS
の :nth-child
疑似クラスは使い方が難しいです。あまり知られていない微妙な点がある そして W3C のページにも明確に文書化されていません。次のようなリストを考えてみましょう。
<ul>
<li class="bird">petrel</li>
<li class="mammal">platypus</li>
<li class="bird">albatross</li>
<li class="bird">shearwater</li>
</ul>
次にセレクター css=li.bird:nth-child(3)
を返します アルバトロス 要素ではありません ミズナギドリ!その理由は、最初に一致した要素の兄弟である要素のリストにインデックス (3) を使用するためです。.bird クラスでフィルタされていない!正しい要素 (この例では 3 番目) を取得すると、 それから 鳥クラスフィルターを適用します。手持ちの要素が一致する場合は、それを返します。そうでない場合は、一致しません。
次にセレクターについて考えてみましょう css=li.bird:nth-child(2)
. 。これは 2 番目の要素であるカモノハシから始まります。これは鳥ではないと判断され、空になります。これは、コードが「見つかりません」例外をスローすることとして現れます。
インデックス付きエントリを見つける典型的なメンタル モデルに適合すると思われるのは、CSS です。 :nth-of-type
フィルタを適用する疑似クラス 前に インデックス作成。残念ながら、公式ドキュメントによると、これは Selenium ではサポートされていません。 ロケータ.
XPath
あなたの質問は、XPath でこれを行う方法をすでに知っていることを示しています。式内の任意の位置に角かっこを使用して配列参照を追加します。たとえば、次のようなものを使用できます。 //*[@id='abc']/div[3]/p[2]/span
指定された ID の 3 番目の div の下の 2 番目の段落でスパンを検索します。
ドム
DOM は XPath と同じ角かっこ表記を使用します を除外する DOM は 0 からインデックス付けされますが、XPath は 1 からインデックス付けされます。 document.getElementsByTagName("div")[1]
最初の div ではなく、2 番目の div を返します。DOM では代替構文も提供しています。 document.getElementsByTagName("div").item(0)
は全く同等です。getElementsByTagName を使用すると、 いつも 単一のノードではなくノードセットを返すため、インデックスを使用する必要があります。