如何使用 Selenium 获取元素的部分文本

How to get partial text of an element using Selenium

我有这个HTML:

<div id="msg">

  <b>text1</b>
  <br>
  text2 <b>text3</b> text4

  <ul class="list">
    <li>...</li>
    <li>...</li>
    <li>...</li>
  </ul>

  text5

</div>

我想使用 xpath 从 div[@id = 'msg'] 中提取 ul 之前的文本。

喜欢 driver.findElement(By.xpath("xpath")).getText() -> text1 text2 text3 text4

有可能还是我应该使用其他逻辑?

根据 中的@kjhughes,XPath 用于 selection,而不是操作。您可以 select 节点,因为它们存在于 XML 文档中,但您不能转换这些节点。

在您的情况下,如果您的 XML 文档包含此节点:

<div id="msg">
  <b>text1</b>
  <br>
  text2 <b>text3</b> text4
  <ul class="list">
    <li>...</li>
    <li>...</li>
    <li>...</li>
  </ul>
  text5
</div>

您可以通过 //div[@id='msg'] select <div> 节点,但是 selected 节点将显示在源 XML 中,也就是说,child 和 class 作为 <ul> 节点中的 list

如果您想通过 XPath 操作或转换节点 selected(排除其 children 元素),您将必须使用宿主语言(XSLT,Java脚本、Python、Java、C# 等)来操纵 selection。


解决方案

要单独提取文本,您可以使用以下解决方案:

WebElement myElement = driver.findElement(By.xpath("//div[@id='msg']"));
String text1 = myElement.findElement(By.xpath("./b")).getAttribute("innerHTML");
String text2 = ((JavascriptExecutor)driver).executeScript('return arguments[0].childNodes[3].textContent;', myElement).toString();
String text3 = ((JavascriptExecutor)driver).executeScript('return arguments[0].childNodes[4].textContent;', myElement).toString();
String text4 = ((JavascriptExecutor)driver).executeScript('return arguments[0].childNodes[5].textContent;', myElement).toString();
String text5 = ((JavascriptExecutor)driver).executeScript('return arguments[0].lastChild.textContent;', myElement).toString();

只是想分享另一个想法。

您可以获得 OuterHTML,然后剥离它直到 "ul" 标记,然后从输出中删除 html 标记。现在您可以根据需要更改字符串。

我几乎可以使用 javascript 获得您要查找的文本。粘贴在下面供您参考,您可以在 Java.

中执行相同的操作
oHTML = document.querySelector("div#msg").outerHTML
oHTML.substring(0,oHTML.search('<ul')).replace(/<.*>/,'').replace(/<\/?[^>]+(>|$)/g, "").replace(/\n/g, " ").trim()

您可以 运行 在浏览器控制台中查看输出。下面是 javascript 输出。

text1      text2 text3 text4