6

Selenium Webdriver を使用していくつかのテストを自動化しようとしています。HTML で重複した ID を使用しているサードパーティのログイン プロバイダ (OAuth) を扱っています。その結果、入力フィールドを正しく「見つける」ことができません。ID を選択すると、間違った ID が取得されます。

この質問は、 JQuery について既に回答されています。しかし、Selenium webdriver で動作する回答 (Xpath を使用していると推測しています) が必要です。

この問題に関する他の質問では、通常、「html に重複した ID を含めないでください」という回答が返されます。そこで合唱団に説教。私は問題のウェブページを管理していません。もしそうなら、私はクラスとIDを適切に使用し、その方法で問題を修正します.

私はそれができないので。xpath などで取得できるオプションは何ですか?

4

5 に答える 5

7

これはdriver.find_element_by_idで実行できます。たとえば、重複する「duplicate_ID」は「div_ID」内にあり、一意です。

driver.find_element_by_id("div_ID").find_element_by_id("duplicate_id")

別のdivの下にある他の重複IDの場合:

driver.find_element_by_id("div_ID2").find_element_by_id("duplicate_id")
于 2012-11-26T12:15:31.517 に答える
6

この XPath 式:

//div[@id='something']

属性の文字列値が文字列「something」である XML ドキュメント内のすべての 要素を選択します。divid

この Xpath 式:

count(//div[@id='something'])

div最初の XPath 式によって選択された要素の数を生成します。

そして、この XPath 式:

(//div[@id='something'])[3]

上記の最初の XPath 式によって選択された 3 番目 (ドキュメント順)divの要素を選択します。

一般的に

(//div[@id='something'])[$k]

$kそのような - 番目のdiv要素を選択します ($kは正の整数で置換する必要があります)。

この知識があれば、属性が文字列値「something」を持つ特定dividものを取得できます。

于 2012-08-14T12:41:29.747 に答える
4

どの言語に取り組んでいますか? xpathを使用してidタグだけでなく、任意の属性を事実上取得できるため、idの重複は問題になりません。構文は他の言語では少し異なります (Ruby 以外のものが必要な場合はお知らせください) が、次のようにします。

driver.find_element(:xpath, "//input[@id='loginid']"

xpath ロケーターを構築する方法は次のとおりです。html コードから任意の属性を選択できます。

<input id="gbqfq" class="gbqfif" type="text" value="" autocomplete="off" name="q">

たとえば、 name属性を使用して上記の HTML コード (Google の検索ボックス) で xpath を構築したいとします。xpath は次のようになります。

    driver.find_element(:xpath, "//input[@name='q']"

つまり、ID が同じ場合は、利用可能な別の属性を取得するだけです!

改善:

XML ドキュメント内の順序などの脆弱な xpath ロケーター (簡単に変更される可能性があります) を回避するには、さらに堅牢なものを使用できます。1 つではなく 2 つの xpath ロケーター。これは、非常に類似した hmtl タグを扱う場合にも役立ちます。次のように、2 つの属性で要素を見つけることができます。

driver.find_element(:id, 'amount') and driver.find_element(xpath: "//input[@maxlength='50']")

または、必要に応じて純粋な xpath ワンライナーで:

//input[@id="amount" and @maxlength='50']

別の方法として (xpath が一意の要素を 1 つだけ返す場合)、抽象化レベルをもう 1 段階上げることができます。属性値を完全に省略:

//input[@id and @maxlength]

于 2012-08-14T12:09:49.293 に答える
3

http://selenium-python.readthedocs.io/locating-elements.htmlにリストされていませんが、メソッドにアクセスできますfind_elements_by_id

これは、重複する ID を持つすべての要素のリストを返します。

links = browser.find_elements_by_id("link")
for link in links:
    print(link.get_attribute("href"))
于 2014-06-04T04:48:37.870 に答える
0

driver.findElement(By.xpath() を使用する必要がありますが、firebug を使用して要素を検索するときは、相対パスを取得するのではなく、特定の要素の絶対パスを選択する必要があります。これにより、ID が重複していても要素を取得できます。

于 2015-04-27T13:33:51.097 に答える