首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过不同的execute_script调用创建和访问js变量

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

Stack Overflow用户
提问于 2019-09-28 14:40:49
回答 1查看 180关注 0票数 0

在我的测试运行期间,有一堆js脚本创建了我稍后必须访问的全局常量。代码库目前的构建方式是我无法避免的。基本上接下来会发生什么:打开一个页面,在一个调用中执行一个脚本,在另一个调用中执行另一个脚本。

代码语言:javascript
运行
复制
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);")

所有的东西都会因为这个错误而崩溃。

代码语言:javascript
运行
复制
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脚本合并为一个脚本的情况下获得正确的结果,或者理解为什么不可能。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-28 18:19:52

每次调用execute_script都会在匿名函数的上下文中调用指定的JavaScript。这是为了不污染自动化页面的DOM而设计的。这意味着在调用中创建的任何变量的作用域都是该调用的持续时间。要访问该作用域之外的变量,需要显式地将其存储在页面DOM中,如下所示:

代码语言:javascript
运行
复制
# Note: could also use window instead
# of document 
driver.execute_script("document.x = 1;")
driver.execute_script("console.log(document.x + 1);")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58144004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档