【问题标题】: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 + "'");
        

        【讨论】:

          猜你喜欢
          • 2018-10-23
          • 2013-08-24
          • 1970-01-01
          • 2021-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-30
          相关资源
          最近更新 更多