我尝试使用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"
。怎么会这样?
答案 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应用程序进行交互。