Selenium WebDriverで、リンクテキストを使用して以下のHTMLにxpathを使用する方法(「新しいボタンを追加」)
<a href="SOME URL">
<span >
<i class=""/>
</span>Add New Button
</a>
私は以下のように要素を検査しようとしましたが、すべての問題は機能しました
1) //a[text()='Add New Button']
2) //a[contains(text(),'Add New Button']
3) //a/span/i[text()='Add New Button']
4) //a/span/i[contains(text(),'Add New Button']
3と4はそうでないことを知っていますが、試してみました。
したがって、そのようなHTML DOMの場合、xpathを使用してリンクテキストを使用してリンクを見つける方法は?
すでに機能している回答の一部は機能しませんが、機能しないものもあります。そして、OPはより多くの説明から利益を得ると思います。
あなたの元の表現:
_//a[text()='Add New Button']
_
「Add New Button」を含むテキストノードの末尾にも改行文字があるため、機能しません。
次のもの:
_//a[contains(text(),'Add New Button']
_
text()
はノードのsequenceを返し、contains()
のような関数はfirstシーケンス内のノード。この場合、a
内の最初のテキストノードには空白のみが含まれ、notは「新しいボタンの追加」を含むノードです。
この主張は次の方法で検証できます。
_//a[contains(text()[2],'Add New Button')]
_
これは、a
の-secondテキストノードに「Add New Button」が含まれているかどうかをテストします。この式はa
要素を返します。しかし、この場合の最善の解決策は次のとおりです。
_//a[contains(.,'Add New Button')]
_
_.
_は、要素のいわゆる「文字列値」、つまり「新しいボタンの追加」を含むすべてのテキストノードの連結に評価されます。
normalize-space()
を使用したソリューションも可能ですが、ネストされた述語があります。
_//a[text()[normalize-space(.) = "Add New Button"]]
_
xpathを使用すると、要素に次のステートメントのテキストが含まれているかどうかを確認できます
//a[contains(., 'Button')]
リンクテキストには、メインテキストの右側から不要なスペースが含まれているため、それらを取り除くために以下を実行する必要があります。
'//a[normalize-space(.)="Add New Button"]'
次のxpath
を使用します
//*[contains(text(),'Add New Button')]
または
//a/i[contains(text(),'Add New Button')]
または
//a[@href='SOME URL']/i
またはcssSelector
を使用-
a[href='SOME URL']>i