339

Selenium で複雑な JavaScript インターフェイスをテストしようとしています (Python インターフェイスを使用し、複数のブラウザー間で)。次の形式のボタンがいくつかあります。

<div>My Button</div>

「マイ ボタン」(または「マイ ボタン」や「ボタン」などの大文字と小文字を区別しない部分一致) に基づいてボタンを検索できるようにしたいと考えています。

明らかな何かが欠けているように感じるほど、これは驚くほど難しいと思います。私がこれまでに持っている最高のものは次のとおりです。

driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]')

ただし、これは大文字と小文字が区別されます。私が試したもう 1 つのことは、ページ上のすべての div を繰り返し処理し、element.text プロパティをチェックすることです。ただし、次のような状況になるたびに:

<div class="outer"><div class="inner">My Button</div></div>

div.outer にもテキストとして「My Button」があります。それを修正するため、div.outer が div.inner の親であるかどうかを調べてみましたが、その方法がわかりませんでした (element.get_element_by_xpath('..') は要素の親を返しますが、 div.outer と等しくないことをテストします)。

また、少なくとも Chrome Webdriver を使用すると、ページ上のすべての要素を反復処理するのが非常に遅いようです。

アイデア?


ここでより具体的なバージョンを尋ねました(そして答えました):子要素のテキストを含めずに、Selenium WebDriverで要素のテキストを取得する方法は?

4

12 に答える 12

421

次のことを試してください。

driver.find_elements_by_xpath("//*[contains(text(), 'My Button')]")
于 2013-09-09T14:54:21.080 に答える
36

次のような XPath 式を試すことができます。

'//div[contains(text(), "{0}") and @class="inner"]'.format(text)
于 2012-09-07T18:44:23.693 に答える
3

類似問題: 探す<button>Advanced...</button>

多分これはあなたにいくつかのアイデアを与えるでしょう(概念をJavaからPythonに移してください):

wait.until(ExpectedConditions.elementToBeClickable(//
    driver.findElements(By.tagName("button")).stream().filter(i -> i.getText().equals("Advanced...")).findFirst().get())).click();
于 2019-05-13T22:16:24.300 に答える
0

driver.find_elements_by_xpathを使用し、そのテキストによる要素の大文字と小文字を区別しない検索に正規表現一致関数を一致させます。

driver.find_elements_by_xpath("//*[matches(.,'My Button', 'i')]")
于 2018-08-30T12:47:59.337 に答える