我正在学习 Selenium,并且对 XPath 有很好的掌握。
我遇到的一个问题是,在网页上,我想要选择一个具有动态生成的
id
和 class
的元素。我尝试过以下方法:
code = driver.find_element_by_xpath("//*[contains(@text='someUniqueString')]")
但是,该元素没有任何文本。相反,它是一个带有 JSON 的
<code>
元素。
<codestyle="display: none" id="something-crazy-dynamic">
{"dataIWantToGrab":{"someUniqueString":...}}
</code>
我正在搜索
innerHTML
以使用 CPU 查找唯一的字符串,但我找不到任何好的资源。
我已经尝试过了
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
我能够解决这个问题,不是使用 Selenium,而是使用 Beautiful Soup。这并不理想,但仍然是一个解决方案。
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 表达式应该返回
code
元素,因为它是目标文本“someUniqueString”的父元素。
尝试以下 XPath 表达式:
//*[contains(text(),'someUniqueString')]
注意:由于
code
元素设置为 display: none
,因此该元素不可见,尽管您可以找到该元素。如果您尝试使用 click
或其他 API 与元素交互,您可能会得到 ElementNotVisisbleException
。简而言之,您无法与 GUI(浏览器)中未显示的元素进行交互。
如果您无法找到该元素,那么您的元素很可能位于
iframe
内。在这种情况下,您必须先切换到框架,然后使用 XPath 来查找元素。
有关帧之间切换的更多详细信息请参见此处。