【问题标题】:How do I use python variable in a javascript?如何在 javascript 中使用 python 变量?
【发布时间】:2015-04-19 23:34:14
【问题描述】:
我一直在寻找一种使用 selenium 的 webdriver 访问不可见文本字段的方法。我让它工作的唯一方法是使用
driver.execute_script("document.getElementById('text_field').value+='XYZ'")
但是,我不想使用XYZ,而是想使用python 变量。
【问题讨论】:
标签:
javascript
python
selenium
webdriver
【解决方案1】:
将变量传递给您通过 Selenium 执行的 JavaScript 代码的常规方法是将变量传递给 execute_script:
foo = "something"
driver.execute_script("""
var foo = arguments[0];
document.getElementById('text_field').value += foo;
""", foo)
您通过arguments object 检索JavaScript 端的参数。您可以这样做,因为您传递给 execute_script 的代码被包装在一个函数中,因此执行的内容类似于:
function () {
var foo = arguments[0];
document.getElementById('text_field').value += foo;
}
并使用传递给execute_script 的参数调用该函数。参数由 Selenium 自动序列化。
使用.format 进行插值或连接字符串是很脆弱的方法。例如,如果您执行'var foo = "' + foo + '"',只要您的foo 变量中有双引号(与'var foo = "{0}"'.format(foo) 相同),它就会中断。使用json.dumps 可以避免这种情况,并且在大多数情况下都可以使用,但它不会处理这样的事情:
el = driver.find_element(".something")
// Do stuff with el on the Python side.
driver.execute_script("""
var el = arguments[0];
// Do something with el on the JavaScript side.
""")
Selenium 知道如何将它提供给您的 Python 对象转换为 JavaScript 端的 DOM 对象。 json.dumps 不会这样做。
【解决方案2】:
您需要获取 Python 变量值的 JavaScript 字符串表示形式,并将其插入到 JavaScript 命令中。幸运的是,Python 的 json 模块会为您完成这项工作。
from json import dumps
driver.execute_script("document.getElementById('text_field').value+=" +
dumps(my_python_variable))
正如其他答案所示,我会谨慎地将值插入引号中。如果值中已经包含引号或需要转义的特殊字符怎么办?如果它根本不是字符串怎么办? json.dumps 将为您处理所有必要的格式化和转义,适合您的变量类型。
【解决方案3】:
除非我遗漏了什么,否则一种选择是:
driver.execute_script("document.getElementById('text_field').value+='{0}'".format(foo))
【解决方案4】:
如果我对问题的理解正确,您将尝试传递 var 而不是硬编码的 XYZ
driver.execute_script("document.getElementById('text_field').value+='" + var + "'");