私は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]
XPathを使用して内部HTMLで照合することはできませんが、「内部テキスト」で照合することはできます。
//*[text()[contains(., 'someUniqueString')]]
上記のXPathは、ターゲットテキスト 'someUniqueString'の親要素であるため、code
要素を返す必要があります。
次のXPathを試してください。
//*[contains(text(),'someUniqueString')]
注:code
要素はdisplay: none
で設定されているため、要素は表示されませんが、要素を見つけることができます。 click
または他のAPIを使用して要素を操作しようとすると、ElementNotVisisbleException
が発生する可能性があります。簡単に言えば、GUI(ブラウザ)に表示されていない要素を操作することはできません。
要素が見つからない場合は、要素がiframe
内にある可能性が高くなります。このような場合、まずフレームに切り替えてから、XPathを使用して要素を検索する必要があります。
フレーム間の切り替えの詳細 こちら 。