Как получить частичный текст элемента с помощью Selenium - PullRequest
0 голосов
/ 06 марта 2019

У меня есть этот 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>

Я хочу извлечь из div[@id = 'msg'] текст до ul, используя xpath.

Как driver.findElement(By.xpath("xpath")).getText() -> text1 text2 text3 text4

Возможно, или я должен использовать другую логику?

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Просто хочу поделиться другой идеей.

Вы можете получить 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
0 голосов
/ 06 марта 2019

В соответствии с @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 # и т. Д.), Чтобы манипулировать выбором.


Решение

Для извлечения текстов по отдельности вы можете использовать следующее решение:

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