Как добавить <script>в голову с помощью Selenium JavascriptExecutor - PullRequest
0 голосов
/ 12 марта 2019

Резюме

Я хочу найти способ добавить тег <script> в заголовок DOM, используя Selenium JavascriptExecutor, или любой другой способ сделать это было бы неплохо.


Я пробовал много способов, а также нашел несколько похожих тем, и ни одна из них не решила мою проблему, поэтому я почувствовал необходимость задать ее здесь.

Например:

Предлагаемые решения в этом вопросе не решили мою проблему. Некоторые люди говорят, что это работает для них, но нет, это не для меня.


Что я пытался выполнить?

Вот небольшой фрагмент кода, который я хочу выполнить:

            WebDriver driver = new FirefoxDriver();
            JavascriptExecutor jse = (JavascriptExecutor) driver;

            jse.executeScript("var s = document.createElement('script');");
            jse.executeScript("s.type = 'text/javascript';");
            jse.executeScript("s.text = 'function foo() {console.log('foo')}';");
            jse.executeScript("window.document.head.appendChild(s);");

Я просто пропустил приведенный выше код, где вы переходите на веб-страницу с помощью driver.get() и т. Д., А затем пытаетесь выполнить сценарии.

Кроме того, s.text будет содержать фактический скрипт, который я хочу использовать, поэтому я просто добавляю функцию foo(), чтобы дать идею.

Приведенный выше код выдает эту ошибку при запуске:

Exception in thread "main" org.openqa.selenium.JavascriptException: ReferenceError: s is not defined


До сих пор я пробовал все возможные решения, которые мог найти в Интернете, но ни одно из них, похоже, не работает.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

С одной стороны, эта строка недопустима.

    jse.executeScript("s.text = 'function foo() {console.log('foo')}';");

Обратите внимание, как вы заключаете текст в одинарные кавычки.Используйте один набор как "\" "

Я бы лично сделал это, выполнив (отредактированный, чтобы сделать его глобальной функцией):

using OpenQA.Selenium.Support.Extensions;

driver.ExecuteJavascript("window.foo = function foo() {console.log('foo')}");

Это так просто. Вы регистрируете fooкак метод, выполняющий это. После выполнения этого javascript вы можете вручную войти в инструменты разработчика браузера и вызвать "foo ()" для проверки. Кроме того, вы можете проверить это, зарегистрировав его непосредственно в консоли. Просто введите "function foo () {console.log ('foo')} "в консоли браузера, а затем вызовите" foo () ".

Нет необходимости добавлять это как тег сценария.

РЕДАКТИРОВАТЬ # 2: я исправил предложенное выше кодовое предложение, чтобы метод назначался окну и, таким образом, был доступен глобально, и вне анонимного скрипта, в котором исполнитель javascript запускает код. Первоначальные проблемы с этим не работают, решаются с помощьюэто, по крайней мере, в моем тестировании.

1 голос
/ 12 марта 2019

ОП предложил следующее решение:

jse.executeScript("var s=window.document.createElement('script');" + 
"s.type = 'text/javascript';" + "s.text = function foo() {console.log('foo')};" + 
"window.document.head.appendChild(s);");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...