簡體   English   中英

如何使用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是用於選擇的,而不是用於操作的。 您可以選擇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']來選擇<div >節點,但是所選節點將顯示在源XML中,即在<ul>具有class作為list的孩子節點。

如果要操縱或轉換通過XPath選擇的節點(以排除其子元素),則必須使用托管語言(XSLT,JavaScript,Python,Java,C#等)來操縱選擇。


要單獨提取文本,可以使用以下解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM