【问题标题】:The browser console doesn't recognize js vars that were injected with selenium webdriver浏览器控制台无法识别注入 selenium webdriver 的 js 变量
【发布时间】:2015-04-12 00:20:20
【问题描述】:

我尝试使用 selenium web-driver 跳转到页面。

然后我通过 selenium web-driver 注入并执行一些 js。

我尝试在这个打开的浏览器控制台中访问这些变量, 但似乎它们不是被创造出来的。怎么会?

我有这个代码:

public void foo (){
        String script =
                "var aLocation = {};" +
                        "var aOffer = {};" +

                        "var aAdData = " +
                        "{ " +
                        "location:  aLocation, " +
                        "offer:    aOffer " +
                        " };" +

                        "var aClientEnv = " +
                        " { " +
                        "    sessionid:     \"\", " +
                        "   cookie:        \"\", " +
                        "       lon:           34.847, " +
                        "       lat:           32.123, " +
                        "       venue:         \"\", " +
                        "    venue_context: \"\", " +

                        "    source:        \"\"," +   // One of the following (string) values: ADS_PIN_INFO,
                        // ADS_0SPEED_INFO, ADS_LINE_SEARCH_INFO,
                        // ADS_ARROW_NEARBY_INFO, ADS_CATEGORY_AUTOCOMPLETE_INFO,
                        // ADS_HISTORY_LIST_INFO
                        // (this field is also called "channel")

                        "    locale:        \"\"" + // ISO639-1 language code (2-5 characters), supported formats:
                        " };" +


                        "W.setOffer(aAdData, aClientEnv);";

            javascriptExecutor.executeScript(script);
}

产生:

script = var aLocation = {}; var aOffer = {}; var aAdData = { location: aLocation, offer: aOffer }; var aClientEnv = { sessionid: "", cookie: "", rtserver - id: 1, lon: 34.847, lat: 32.123, venue: "", venue_context: "", source: "", locale: "" }; W.setOffer(aAdData, aClientEnv);

我在这个浏览器控制台中评估aLocation 并得到"variable not defined"。这怎么可能?

【问题讨论】:

    标签: java javascript selenium selenium-webdriver webdriver


    【解决方案1】:

    因为你的变量不是global。一旦您使用var 声明它们,它们就会被限定。如果你想测试一些东西,只需在上面的脚本中输入nemo=100; 并尝试在控制台中打印出来,它应该可以工作。

    编辑 #1 顺便说一句,我绝不是在这里提倡全局变量。我只是想解释一下 WebDriver 执行的 JS 中的变量发生了什么。如果您想使用全局变量,那么像 window.foo 这样的更明确的声明会像其他人建议的那样更有意义。但是总体上尽量避免使用它们。此外,尽量避免首先使用 WebDriver 执行 JavaScript 除非你别无选择。 WebDriver 应该为您模拟真实用户,而您的用户不太可能执行 JavaScript 来与您的网络应用交互。

    【讨论】:

      【解决方案2】:

      了解 Selenium 如何执行在浏览器中执行的 JavaScript 非常重要。

      nilesh's answer 所暗示的相反,在变量声明前添加var 不会将其从全局空间中取出。例如,如果var foo = 1 在函数范围之外执行,它将声明一个名为foo 的全局变量。

      关键是 Selenium 如何执行脚本。 Selenium 有可能在全局空间中执行传递给executeScript 的脚本。 (有办法。)但是,它没有。它所做的是将脚本包装在一个新函数中,这样任何出现在传递给executeScript 的代码中的var 都将声明一个局部变量。

      只需删除 var 即可,但当我想操纵全局空间时,我更愿意明确表示。我明确地访问了window 对象(例如window.foo = 1)。删除 var 看起来可能是一个错误,而使用 window. 看起来是故意的。

      【讨论】:

      • 我的回答根本不建议以这种方式使用全局变量。它只是回答了关于他的变量发生了什么的问题。另外,如果我理解你的话,你的第二段和第四段是矛盾的。声明 var foo 不会声明全局变量 foo
      • 你没看懂我的回答。
      • 很有可能。我不明白这部分“例如,如果 var foo = 1 在函数范围之外执行,它将声明一个名为 foo 的全局变量。”
      • 将该语句放在<script> 标记中,加载它,然后检查window.foo 的值。它将是 1。var 语句确定一个变量是否将是全局的 only 如果它在函数的范围内。在函数范围之外,var 或没有 var,变量将是全局的。
      • 我明白了。但这不是在 selenium 上下文中,而是在 JS 上下文中。在 selenium 中,您只能访问 driver.executeScript
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多