Невозможно использовать свойства узла DOM в качестве фильтров в запросе XPath / CSS Selector - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь искать элементы DOM, используя свойства узла DOM , например innerText и textContent, в качестве фильтров, но безуспешно.

Взять этот HTML, например:

<html>
  <body>
    <div class="one">
      <div class="two">
        <div class="three">
          <div>Text Here</div>
        </div>
      </div>
    </div>
  </body>
</html>

Если я ищу узел с помощью атрибута класса, я могу получить доступ к свойству innerText, как с помощью функций XPath (оценка), так и CSS Selector (querySelectorAll):

document.evaluate("//div[@class = 'one']",
    document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,
    null).singleNodeValue.innerText;

document.querySelectorAll("div.one")[0].innerText;

Однако использование свойства innerText вместо class не дает результата:

 document.evaluate("//div[@innerText = 'Text Here']",
     document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,
     null).singleNodeValue;

 document.querySelectorAll("div[innerText='Text Here']")[0];

Я тестировал с nodeName и textContent, и он тоже не удался, поэтому я думаю, что это связано со свойствами DOM, которые не являются атрибутами тегов.

Я пытался использовать функцию XPath text(), но использование ее на <div class="one"> из приведенного выше примера не вернет "Text Here".

Все тесты были сделаны на Google Chrome v67, на Linux Mint.

Почему это происходит? Есть ли какое-либо решение или обходной путь для того, что я пытаюсь сделать?

1 Ответ

0 голосов
/ 25 июня 2018

innerText не является атрибутом , поэтому @innerText не работает.Также 'Text Here' не является дочерним текстовым узлом <div class="one">, но является нисходящим текстовым узлом, поэтому //div[text()='Text Here' and @class='one'] не будет работать (однако //div[.//text()='Text Here' and @class='one'] должно работать)

Вы должны попробовать ниже найти требуемый div по текстовому содержимому :

document.evaluate("(//div[.='Text Here'])[1]",
     document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,
     null).singleNodeValue;

Если есть больше текстовых узлов-потомков, но вы хотите найти их только по "Text Here", вы можете попробовать XPath:

(//div[.//div='Text Here'])[1]
...