web-dev-qa-db-ja.com

Selenium-XPATH-innerHTMLによる要素の検索

私はSeleniumを学んでいて、XPATHをかなり理解しています。

私が遭遇している問題は、Webページに動的に生成されたidおよびclassがある選択したい要素があることです。私は以下を試しました:

code = driver.find_element_by_xpath("//*[contains(@text='someUniqueString')]")

ただし、要素にはテキストがありません。代わりに<code>要素とJSON。

<codestyle="display: none" id="something-crazy-dynamic"> 
    {"dataIWantToGrab":{"someUniqueString":...}}
</code>

私が探しているのは、innerHTMLを検索してXPATHを使用して一意の文字列を見つけることですが、適切なリソースが見つかりません。

私はもう試した

driver.find_element_by_xpath("//*[contains(@innerHTML='someUniqueString')]")

しかし、エラーを受け取っています

Selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: //*[contains(@innerHTML='someUniqueString')]

編集:以下は私が作業している兄弟のテキストへのリンクです

https://Gist.github.com/anonymous/b227e59c942e7ec9f5a851a3b7ecdfc6

編集2:SeleniumではなくBeautifulSoupを使用することで、これを回避することができました。理想的ではありませんが、それでも解決策です。

soup = BeautifulSoup(driver.page_source)
codes = soup.find_all("code")
found_json = [i for i in codes if i.text.find("someUniqueString") > 0]
7
shartshooter

XPathを使用して内部HTMLで照合することはできませんが、「内部テキスト」で照合することはできます。

//*[text()[contains(., 'someUniqueString')]]

`demo

上記のXPathは、ターゲットテキスト 'someUniqueString'の親要素であるため、code要素を返す必要があります。

13
har07

次のXPathを試してください。

//*[contains(text(),'someUniqueString')]

注:code要素はdisplay: noneで設定されているため、要素は表示されませんが、要素を見つけることができますclickまたは他のAPIを使用して要素を操作しようとすると、ElementNotVisisbleExceptionが発生する可能性があります。簡単に言えば、GUI(ブラウザ)に表示されていない要素を操作することはできません。


要素が見つからない場合は、要素がiframe内にある可能性が高くなります。このような場合、まずフレームに切り替えてから、XPathを使用して要素を検索する必要があります。

フレーム間の切り替えの詳細 こちら

3