Python 通过不同的execute_脚本调用创建和访问js变量
在我的测试运行期间,有一堆js脚本,它们创建了我以后必须访问的全局常量。代码库目前是以我无法避免的方式构建的。接下来的事情基本上会发生:打开一个页面,在一个调用中执行一个脚本,在另一个调用中执行另一个脚本Python 通过不同的execute_脚本调用创建和访问js变量,python,selenium,selenium-webdriver,Python,Selenium,Selenium Webdriver,在我的测试运行期间,有一堆js脚本,它们创建了我以后必须访问的全局常量。代码库目前是以我无法避免的方式构建的。接下来的事情基本上会发生:打开一个页面,在一个调用中执行一个脚本,在另一个调用中执行另一个脚本 从selenium导入webdriver 使用webdriver.Firefox()作为驱动程序: 驱动程序。获取(“http://127.0.0.1:8000") driver.execute_脚本(“const x=1;”) driver.execute_脚本(“console.log(x
从selenium导入webdriver
使用webdriver.Firefox()作为驱动程序:
驱动程序。获取(“http://127.0.0.1:8000")
driver.execute_脚本(“const x=1;”)
driver.execute_脚本(“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
回溯(最近一次呼叫最后一次):
文件“test\u hello\u selenium.py”,第24行,在
driver.execute_脚本(“console.log(x+=1);”)
文件“~/python3.6/site packages/selenium/webdriver/remote/webdriver.py”,第636行,在执行脚本中
'args':已转换的_args})['value']
文件“~/python3.6/site packages/selenium/webdriver/remote/webdriver.py”,第321行,执行
self.error\u handler.check\u响应(响应)
文件“~/python3.6/site packages/selenium/webdriver/remote/errorhandler.py”,第242行,在check\u响应中
引发异常类(消息、屏幕、堆栈跟踪)
selenium.common.exceptions.JavascriptException:Message:ReferenceError:x未定义
事实上,司机并不重要。使用chromedriver时,错误保持不变
实际的问题是如何在不将两个js脚本合并为一个脚本或理解为什么不可能的情况下获得正确的结果。每次调用
execute\u 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);")
每次调用
execute\u 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);")
但是它在python-selenium2.x上运行良好。这是一个bug吗?它可能是W3C WebDriver规范正在标准化的驱动程序行为的产物。如果它曾经工作过,但现在不再工作了,那么当前的行为是正确的,但是它在python-selenium2.x上工作正常。这是一个bug吗?它可能是W3C WebDriver规范正在标准化的驱动程序行为的产物。如果它曾经工作过,但不再工作,则当前行为是正确的。