如何使用 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
我有这个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
有可能还是我应该使用其他逻辑?
根据
在您的情况下,如果您的 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