如何在javascript中使用python变量?

时间:2015-02-18 19:47:51

标签: javascript python selenium webdriver

我一直在寻找一种使用selenium的webdriver访问不可见文本字段的方法。让它工作的唯一方法是使用

driver.execute_script("document.getElementById('text_field').value+='XYZ'")

但是,我想使用python变量,而不是使用XYZ

4 个答案:

答案 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 + "'");