Selenium:在 Java 中使用 cssSelector 提取 div 的文本
Posted
技术标签:
【中文标题】Selenium:在 Java 中使用 cssSelector 提取 div 的文本【英文标题】:Selenium: Extract Text of a div with cssSelector in Java 【发布时间】:2012-05-08 09:26:36 【问题描述】:我正在使用 Selenium 为网页编写 JUnit 测试,并且我正在尝试验证页面中是否存在预期的文本。我正在测试的网页代码如下:
<div id="recipient_div_3" class="label_spacer">
<label class="nodisplay" for="Recipient_nickname"> recipient field: reqd info </label>
<span id="Recipient_nickname_div_2" class="required-field"> *</span>
Recipient:
</div>
我想将预期的内容与页面上的内容进行比较,所以我想使用 断言.assertTrue()。我知道要从 div 中获取所有内容,我可以这样做
String element = driver.findElement(By.cssSelector("div[id='recipient_div_3']")).getText().replaceAll("\n", " ");
但这将返回“reqd info * Recipient:”
有没有什么方法可以只使用 cssSelector 从 div(“收件人”)中获取文本,而不需要其他标签?
【问题讨论】:
【参考方案1】:你不能用 CSS 选择器做到这一点,因为 CSS 选择器没有足够细粒度的方法来表达“包含在 DIV 中的文本节点,而不是它的其他内容”。不过,您可以使用 XPath 定位器来做到这一点:
driver.findElement(By.xpath("//div[@id='recipient_div_3']/text()")).getText()
该 XPath 表达式将仅识别作为 DIV 的直接子节点的单个文本节点,而不是其中包含的所有文本及其子节点。
【讨论】:
提供的 XPath 定位器是合乎逻辑的,可以在 Chrome 的控制台中使用,但在 Selenium 中不起作用。 Selenium 会抛出以下错误...The given selector //div[@class='StdLevel1']/text() is either invalid or does not result in a WebElement. The following error occurred: InvalidSelectorError: The result of the xpath expression "//div[@class='StdLevel1']/text()" is: [object Text]. It should be an element.
那么有没有解决方案,或者你只是抓住 div 并解析 getText() 字符串?
据我了解,Infact selenium 确实允许 text()、node etc.function。【参考方案2】:
我不确定是否可以使用一个 css 定位器,但您可以从 div 获取文本,然后从 div 的子节点获取文本并减去它们。类似的东西(未检查代码):
String temp = "";
List<WebElement> tempElements = driver.findElements(By.cssSelector("div[id='recipient_div_3'] *"));
for (WebElement tempElement : tempElements)
temp =+ " " + tempElement.getText();
String element = driver.findElement(By.cssSelector("div[id='recipient_div_3']")).getText().replaceAll("\n", " ").replace(temp, "");
这是为了避免使用 xpath。 Xpath 允许这样做:
//div[@id='recipient_div_3']/text()
【讨论】:
【参考方案3】:您还可以获取元素的文本内容并使用正则表达式删除标签。另请注意:您应该使用不情愿的量词 https://docs.oracle.com/javase/tutorial/essential/regex/quant.html
String getTextContentWithoutTags(WebElement element)
return element.getText().replaceAll("<[^>]*?/>", "").trim();
【讨论】:
以上是关于Selenium:在 Java 中使用 cssSelector 提取 div 的文本的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中使用 Selenium WebDriver (Selenium 2) 输入文本框?
使用 Java 在 Selenium WebDriver (selenium 2) 中处理警报
如何使用 Java 在 selenium webdriver 中打开新选项卡,或者如何使用 selenium webdriver 使用动作类在 selenium 中按 ctrl + T [重复]
如何在 Eclipse 中使用 Selenium 将外部 .js 导入到我的 Java 测试中?