我有这个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
有可能还是我应该使用其他逻辑?
答案 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