Selenium - XPATH - 通过innerHTML搜索元素

时间:2017-03-14 04:56:13

标签: html python-2.7 selenium xpath beautifulsoup

我正在学习Selenium并且对XPATH有很好的掌握。

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

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

但是,该元素没有任何文字。相反,它是带有JSON的<code>元素。

<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]

2 个答案:

答案 0 :(得分:11)

您无法通过内部HTML匹配XPath,但您可以使用它来匹配内部文本&#39; :

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

<强> `demo

上面的XPath应该返回code元素,因为它是目标文本的父元素&some; aUniqueString&#39;。

答案 1 :(得分:3)

尝试以下XPath:

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

注意:由于code元素设置为display: none,因此该元素不可见,但可以找到元素。如果您尝试使用click或其他API与元素进行互动,则可能会获得ElementNotVisisbleException。简而言之,您无法与GUI(浏览器)上未显示的元素进行交互。

如果您无法找到该元素,那么您的元素很可能位于iframe内。在这种情况下,您必须先切换到帧,然后使用XPath查找元素。

有关在here帧之间切换的更多细节。