我正在学习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
以使用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]
答案 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帧之间切换的更多细节。