Selenium - XPath - 通过innerHTML查找元素

16

我正在学习Selenium,并且对XPath有相当的掌握。

我遇到的问题是,在一个网页上,有一个元素我想选择它,但它具有动态生成的idclass。我已经尝试了以下方法:

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

然而,该元素并没有任何文本。相反,它是一个带有 JSON 的 <code> 元素。

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

我想用CPU搜索innerHTML以查找唯一的字符串,但我找不到任何好的资源。

我已经尝试过:

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]

id 的任何部分都是固定的还是全部都是动态的? - Guy
有一部分是固定的,但大约有15个其他元素具有相同的命名约定。 - shartshooter
你可以依赖于父、子和兄弟元素。请分享相关的HTML代码(给定元素上方和下方5个元素)。 - Naveen Kumar R B
@Naveen - 我在这里包含了更多的HTML代码 - https://gist.github.com/anonymous/b227e59c942e7ec9f5a851a3b7ecdfc6 - shartshooter
2个回答

22

您无法使用XPath通过内部HTML进行匹配,但可以使用它通过“内部文本”进行匹配:

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

`演示

上述XPath表达式应该返回code元素,因为它是目标文本“someUniqueString”的父元素。


我面临的问题是 innerTEXT 返回 null,但 innerHTML 不是。 - shartshooter
@kmomo,我指的不是字面上的 innerTEXT,请看上面的代码片段。似乎 innerHTML 是 Selenium 的一个东西,所以你可能可以使用它。只是你的 XPath 表达式有点问题,应该用 , 替换 =contains(@innerHTML,'someUniqueString') - har07
无法正常工作 - driver.find_element_by_xpath("//*[contains(@innerHTML,'someUniqueString')]") 返回 Message: Unable to locate element: //*[contains(@innerHTML,'someUniqueString')] - shartshooter
2
@kmomo,你也试过这个答案中的 XPath 吗?//*[text()[contains(., 'someUniqueString')]] - har07

4

尝试以下XPath表达式:

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

注意:由于code元素设置为display: none,因此该元素是不可见的,尽管您可以找到该元素。如果您尝试使用click或其他API与元素交互,则可能会收到ElementNotVisisbleException。简单来说,您无法与GUI(浏览器)中未显示的元素进行交互。
如果您无法找到该元素,则很有可能您的元素位于iframe中。在这种情况下,您必须先切换到帧,然后再使用XPath查找元素。
有关在框架之间切换的更多详细信息,请单击此处

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接