在 Selenium 测试中使用 XPath 通过文本获取 WebElement
Posted
技术标签:
【中文标题】在 Selenium 测试中使用 XPath 通过文本获取 WebElement【英文标题】:Getting WebElement by Text using XPath in Selenium test 【发布时间】:2015-12-30 00:34:10 【问题描述】:我想使用 XPath 查找基于文本的任何 WebElement。
我有兴趣找到的WebElement,
它的 html,
基本上我试图通过 Text 检索的 WebElement 包含一个输入元素。
我目前使用,
driver.findElement(By.xpath("//*[normalize-space(text()) = 'Own Hotel']"));
它没有找到上面的 WebElement,但它通常可以检索所有其他 Web 元素。
偶数,
By.xpath("//*[contains(text(),'Own Hotel')]")
没有给我任何结果。虽然我对精确的文本匹配感兴趣。
我正在寻找一种方法,通过与 Web 元素中存在的元素无关的文本来查找 Web 元素。如果文本匹配,它应该返回 WebElement。
谢谢!
【问题讨论】:
页面上没有 iframe。抛出NoSuchElementException
这不是等待问题。我在加载页面时在 chrome 上测试了这个 xpath,它没有找到该元素。因此,我的 xpath 不适用于这种情况。我需要替代 xapth。
请将 HTML 代码发布为文本而不是图片。在将来某个时候,图片将不再可用,这个问题也不会有帮助。
【参考方案1】:
似乎文本被包裹在标签内而不是输入。试试这个
driver.findElement(By.xpath(".//label[text()[normalize-space() = 'Own Hotel']]"));
关于这个 xpath 模式有很好的解释 here
【讨论】:
【参考方案2】:在下面的 HTML 中:
<input>
节点内的innerText Own Hotel 在开头和结尾都包含大量空白字符。由于存在这些前导和尾随空白字符,您不能将位置路径 text()
用作:
text()
选择上下文节点的所有文本节点子节点
作为替代方案,您需要使用String Function string normalize-space(string?)
,如下所示:
driver.findElement(By.xpath("//*[normalize-space()='Own Hotel']"));
但是,最好添加 tagName 并最好添加一个 unque 属性,使您的搜索更加精细,如下所示:
使用 tagName 和 normalize-space()
:
driver.findElement(By.xpath("//input[normalize-space()='Own Hotel']"));
使用 tagName 和 normalize-space()
:
driver.findElement(By.xpath("//input[@name='ownHotel' and normalize-space()='Own Hotel']"));
参考文献
你可以使用 normalize-space() 找到几个相关的讨论:
How to click on a link with trailing white-space characters on a web page using Selenium? How to locate and click the element when the innerText contains leading and trailing white-space characters using Selenium and Python How to click on the button when the textContext contains leading and trailing white-space characters using Selenium and Python【讨论】:
以上是关于在 Selenium 测试中使用 XPath 通过文本获取 WebElement的主要内容,如果未能解决你的问题,请参考以下文章
Python3-Selenium自动化测试框架之xpath元素定位
web自动化测试-D3-学习笔记之一(Selenium彩蛋篇-Xpath使用方法)
selenium.common.exceptions.InvalidSelectorException:消息:给定的 xpath 表达式通过 Selenium 在 scrollIntoView 中使用