Selenium - XPath - 通过innerHTML 搜索元素

问题描述 投票:0回答:2

我正在学习 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]
html python-2.7 selenium xpath beautifulsoup
2个回答
22
投票

你不能使用XPath来匹配内部HTML,但你可以使用它来匹配“内部文本”:

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

`演示

上面的 XPath 表达式应该返回

code
元素,因为它是目标文本“someUniqueString”的父元素。


4
投票

尝试以下 XPath 表达式:

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

注意:由于

code
元素设置为
display: none
,因此该元素可见,尽管您可以找到该元素。如果您尝试使用
click
或其他 API 与元素交互,您可能会得到
ElementNotVisisbleException
。简而言之,您无法与 GUI(浏览器)中显示的元素进行交互。


如果您无法找到该元素,那么您的元素很可能位于

iframe
内。在这种情况下,您必须先切换到框架,然后使用 XPath 来查找元素。

有关帧之间切换的更多详细信息请参见此处

© www.soinside.com 2019 - 2024. All rights reserved.