浏览器控制台无法识别注入 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.
看起来是故意的。
我尝试使用 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.
看起来是故意的。