web-dev-qa-db-ja.com

SeleniumとxPath-テキストを含めることでリンクを見つける

XPathを使用してテキストを含む要素を見つけようとしていますが、機能しません。

WebElement searchItemByText = driver.findElement(By.xpath("//*[@id='popover-search']/div/div/ul/li[1]/a/span[contains(text()='Some text')]"));

「contains」を含む最後のビットを削除すると、span要素が見つかりますが、テキストの内容に基づいて選択する必要があります。切り捨てられた文字列も含まれている可能性があるため、「一部のテキスト」にも完全には一致しません。

誰もが問題を見ていますか?

18
joakimnorberg

問題はここにあると思います:

_[contains(text()='Some text')]
_

これを分解するには、

  1. _[]_は、そのノードセット内の個々のノード(ケースの各スパンノード)で動作する条件です。動作する個々のノードのいずれかが括弧内の条件に一致する場合に一致します。
  2. text()は、コンテキストノードの子であるすべてのテキストノードに一致するセレクターです。ノードセットを返します。
  3. containsは、文字列を操作する関数です。ノードセットが渡された場合、ノードセットは ドキュメントセットの最初にあるノードセット内のノードの文字列値を返すことで文字列に変換されます です。

これを変更してみてください

[text()[contains(.,'Some text')]]

  1. 外側の_[]_は、そのノードセットの個々のノードで動作する条件ですtext()は、コンテキストノードの子であるすべてのテキストノードに一致するセレクターです。ノードを返しますセット。

  2. 内側の_[]_は、そのノードセットの各ノードで動作する条件です。

  3. containsは、文字列を操作する関数です。ここでは、個々のテキストノード(_._)が渡されます。

42
dnlcrl

これを使って

//*[@id='popover-search']/div/div/ul/li[1]/a/span[contains(text(),'Some text')]

OR

//*[@id='popover-search']/div/div/ul/li[1]/a/span[contains(.,'Some text')]
13
UmarKashmiri
@FindBy(xpath = "//button[@class='btn btn-primary' and contains(text(), 'Submit')]") private WebElementFacade submitButton;

public void clickOnSubmitButton() {
    submitButton.click();
}   
3
jaxy