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

时间:2019-03-06 12:37:52

标签: java selenium selenium-webdriver xpath xpath-1.0

我有这个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

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

2 个答案:

答案 0 :(得分:0)

根据this discussion中的@ kjhughes,XPath用于选择,而非操纵。您可以选择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选择//div[@id='msg']>节点,但是所选节点将显示在源XML中,即带有 class 的子节点为list节点中的<ul>

如果要操纵或转换通过XPath选定的节点(以排除其子元素),则必须使用托管语言(XSLT,JavaScript,Python,Java,C#等)来操纵选择。 / p>


解决方案

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

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();

答案 1 :(得分:0)

只想分享另一个想法。

您可以获取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