通过不同的execute_script调用创建和访问js变量

Mon*_*eal 2 python selenium selenium-webdriver

在我的测试运行期间,有一堆 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);")
Run Code Online (Sandbox Code Playgroud)

一切都因这个错误而崩溃。

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
Run Code Online (Sandbox Code Playgroud)

其实,司机并不重要。使用 chromedriver 错误保持不变。

实际问题是如何在不将两个 js 脚本合并为一个的情况下获得正确的结果,或者理解为什么这是不可能的。

Jim*_*ans 5

每次致电execute_script在匿名函数的上下文中调用指定的 JavaScript。这是设计使然,以免污染正在自动化的页面的 DOM。这意味着在调用中创建的任何变量的作用域都是该调用的持续时间。要访问该范围之外的变量,您\xe2\x80\x99d 需要将其显式存储在页面 DOM 中,如下所示:

\n\n
# Note: could also use window instead\n# of document \ndriver.execute_script("document.x = 1;")\ndriver.execute_script("console.log(document.x + 1);")\n
Run Code Online (Sandbox Code Playgroud)\n