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 测试中?

Selenium:在 Java 中使用 cssSelector 提取 div 的文本

如何在 Selenium 中找到具有特定文本的跨度? (使用 Java)