我一直在寻找一种使用selenium的webdriver访问不可见文本字段的方法。让它工作的唯一方法是使用
driver.execute_script("document.getElementById('text_field').value+='XYZ'")
但是,我想使用python变量,而不是使用XYZ
。
答案 0 :(得分:7)
将变量传递给通过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.
""")
当您在JavaScript端找到DOM对象的对象时,Selenium知道如何转换它为您提供的Python对象。 json.dumps
不会这样做。
答案 1 :(得分:2)
您需要获取Python变量值的JavaScript字符串表示形式,并将其插入JavaScript命令中。幸运的是,Python的json
模块将为您完成此任务。
from json import dumps
driver.execute_script("document.getElementById('text_field').value+=" +
dumps(my_python_variable))
我会谨慎地将值插入引号中,如其他答案所示。如果值中已经有引号,或者需要转义的特殊字符怎么办?如果它根本不是一个字符串怎么办? json.dumps
将根据您的变量类型处理所有必要的格式和转义。
答案 2 :(得分:1)
除非我遗漏了什么,否则一个选项是:
driver.execute_script("document.getElementById('text_field').value+='{0}'".format(foo))
答案 3 :(得分:0)
如果我正确理解了问题,您尝试传递var
而不是硬编码XYZ
driver.execute_script("document.getElementById('text_field').value+='" + var + "'");