在我的测试运行期间,有一堆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脚本合并为一个脚本的情况下获得正确的结果,或者理解为什么不可能。
发布于 2019-09-28 18:19:52
每次调用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);")
https://stackoverflow.com/questions/58144004
复制相似问题