Создание и доступ к переменным js с помощью различных вызовов execute_script - PullRequest
0 голосов
/ 28 сентября 2019

Во время моего тестового прогона есть куча js-скриптов, которые создают глобальные константы, к которым я должен получить доступ позже.Кодовая база в настоящее время построена так, как я не могу этого избежать.По сути, происходят следующие вещи: открывается страница, в одном вызове выполняется один сценарий, а в другом вызове выполняется другой сценарий.

from selenium import webdriver


with webdriver.Firefox() as driver:
    driver.get("http://127.0.0.1:8000")
    driver.execute_script("const x = 1;")
    driver.execute_script("console.log(x + 1);")

Все вылетает с этой ошибкой.

Traceback (most recent call last):
  File "test_hello_selenium.py", line 24, in <module>
    driver.execute_script("console.log(x += 1);")
  File "~/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 636, in execute_script
    'args': converted_args})['value']
  File "~/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "~/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.JavascriptException: Message: ReferenceError: x is not defined

На самом деле, водитель не имеет значения.С chromedriver ошибка остается прежней.

Фактический вопрос заключается в том, как добиться правильного результата без объединения двух js-скриптов в один или понять, почему это невозможно.

1 Ответ

1 голос
/ 28 сентября 2019

Каждый вызов execute_script вызывает указанный JavaScript в контексте анонимной функции.Это сделано для того, чтобы не загрязнять DOM автоматизируемой страницы.Следствием этого является то, что любые переменные, созданные в вызове, ограничены продолжительностью этого вызова.Чтобы получить доступ к переменной вне этой области, вам нужно явно сохранить ее в DOM страницы, например:

# Note: could also use window instead
# of document 
driver.execute_script("document.x = 1;")
driver.execute_script("console.log(document.x + 1);")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...