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

时间:2015-02-11 15:04:22

标签: java javascript selenium selenium-webdriver webdriver

我尝试使用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"。怎么会这样?

enter image description here

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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

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