浏览器控制台无法识别注入 selenium webdriver 的 js 变量

The browser console doesn't recognize js vars that were injected with selenium webdriver

我尝试使用 selenium 网络驱动程序浏览网页。

然后我通过 selenium 网络驱动程序注入并执行一些 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"。怎么会这样?

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

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

重要的是要知道 Selenium 如何执行在浏览器中执行的 JavaScript。

的含义相反,在变量声明前加上 var 不会将其从全局 space 中删除。例如,如果 var foo = 1 在函数范围之外执行,它将声明一个名为 foo.

的全局变量

关键在于Selenium如何执行脚本。 Selenium 可能 执行全局 space 中传递给 executeScript 的脚本。 (有方法。) 然而,它没有。它所做的是将脚本包装在一个新函数中,因此传递给 executeScript 的代码中出现的任何 var 都将声明一个局部变量。

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