document.evaluate JavaScript ничего не возвращает в AppleScript - PullRequest
1 голос
/ 19 апреля 2019

Я пишу сценарий AppleScript для очистки веб-страницы в Safari, и есть часть, с которой я боролся довольно долго.

Это возвращает необходимый текст: log (do JavaScript "document.querySelector('h1 > span').innerHTML;" in front document)

И это не так: log (do JavaScript "document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;" in front document)

В инспекторе браузера оба подхода работают, но в AppleScript у меня не работает ни один вариант xpaths.

ИМне действительно нужно использовать функцию document.evaluate для выполнения таких вещей, как document.evaluate("//p[contains(., 'Metrics')]/following-sibling::p[1]/text()[normalize-space()]", document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; в том же сценарии.

Как это нужно переписать, чтобы начать выводить результаты в AppleScript?


Пример HTML-кода:

<html>
<body>
  <h1>
    <span>Test Entry</span>
  </h1>
</body>
</html>

Вывод Safari Web Inspector (демонстрирует, что querySelector и evaluate работают без проблем):

> document.querySelector('h1 > span').innerHTML;
< "Test Entry"
> document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
< "Test Entry"

Код редактора AppleScript:

tell application "Safari"
  log (do JavaScript "document.querySelector('h1 > span').innerHTML;" in front document)
  log (do JavaScript "document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;" in front document)
end tell

Вывод редактора AppleScript (демонстрирует, что querySelector работает, а evaluate не работает):

(*Test Entry*)
(**)

1 Ответ

1 голос
/ 23 апреля 2019

Выражение XPath, которое вы используете для минимальной выборки (//h1/span/text()[normalize-space()]), выбирает текстовый узел в DOM браузера и при использовании document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue ваш код Javascript возвращает этот текстовый узел (https://dom.spec.whatwg.org/#text)., пока браузерспециализированный инспектор может затем напрямую отобразить содержимое текстового узла, похоже, что ваша консоль AppleScript этого не делает.

Если вы хотите, чтобы ваш код Javascript возвращал простую строку со значением текстового узла, вы можете использоватьdata свойство (https://dom.spec.whatwg.org/#dom-characterdata-data) текстового узла, так же, как вы использовали свойство innerHTML узла элемента, полученного из вызова querySelector.

Итак

document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue

в Javascript возвращает текстовый узел DOM и для получения строки с содержимым текстового узла используйте свойство data, например,

document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.data

Другой вариант - использовать

document.evaluate('//h1/span/text()[normalize-space()]', document.body, null, XPathResult.STRING_TYPE, null).stringValue

Поскольку вам нужен минимальный пример, обратите внимание также на то, что, пока вы используете абсолютный XPath, начинающийся с / или //, вы ничего не получите, используя document.body в качестве второго аргументаdocument.evaluate, достаточно передать только document и дать тот же результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...