9

我正在使用 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>

我想将预期的内容与页面上的内容进行比较,所以我想使用 Assert.assertTrue()。我知道要从 div 中获取所有内容,我可以做到

String element = driver.findElement(By.cssSelector("div[id='recipient_div_3']")).getText().replaceAll("\n", " ");

但这将返回“reqd info * Recipient:”

有没有办法使用cssSelector从div(“收件人”)中获取文本,而不使用其他标签?

4

3 回答 3

5

你不能使用 CSS 选择器来做到这一点,因为 CSS 选择器没有足够细粒度的方法来表达“包含在 DIV 中的文本节点,但不是它的其他内容”。不过,您可以使用 XPath 定位器来做到这一点:

driver.findElement(By.xpath("//div[@id='recipient_div_3']/text()")).getText()

该 XPath 表达式将标识作为 DIV 的直接子节点的单个文本节点,而不是其中包含的所有文本及其子节点。

于 2012-04-27T16:58:49.157 回答
4

我不确定是否可以使用一个 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()
于 2012-04-27T16:34:54.800 回答
0

您还可以获取元素的文本内容并使用正则表达式删除标签。另请注意:您应该使用不情愿的量词 https://docs.oracle.com/javase/tutorial/essential/regex/quant.html

String getTextContentWithoutTags(WebElement element) {
    return element.getText().replaceAll("<[^>]*?/>", "").trim();
}
于 2016-05-12T12:47:56.160 回答