需要帮助来解决变量范围问题
问题描述:
我无法访问driver.executeScript
中的names
数组。请提出解决方案;需要帮助来解决变量范围问题
var webdriver = require('selenium-webdriver'),
By = webdriver.By,
until = webdriver.until;
var driver = new webdriver.Builder().forBrowser('chrome').build();
var flow = webdriver.promise.controlFlow();
var names = ["name1", "name2"];
var len = names.length;
var j = 0
for (var i = 0; i < len; i++) {
flow.execute(function() {
console.log(names[j]); //this works fine.
driver.executeScript(function() {
//console.log(names[j]); //this gives errror [WebDriverError: unknown error: names is not defined]
//console.log('testing'); //this never logs
});
j++;
});
}
答
您可以使用参数定义函数,并将名称传递给它;
for(var i=0;i<len;i++){
flow.execute(function(){
console.log(names[j]); //this works fine.
driver.executeScript(func(names[j]))
j++;
});
}
function func(name) {
console.log(name);
console.log('testing');
}
更好的规避访问全局变量,试图通过变量&返回它们保持可读&维护的代码。
答
注意:谢谢你@bureaquete为你解答。这也适用于我。
var webdriver = require('selenium-webdriver'),
By = webdriver.By,
until = webdriver.until;
var driver = new webdriver.Builder().forBrowser('chrome').build();
var flow = webdriver.promise.controlFlow();
var names = ["name1","name2"];
var len = names.length;
var j=0
for(var i=0;i<len;i++){
flow.execute(function(name) {
return function(){
var str = console.log(name);
}
}(names[j]));
j++
}
+1
查看更新评论:) – Triven
+0
@trieven你能检查吗?你有这个问题吗? jsbin.com/boholukafa/edit?js,console,output用我的答案你得到正确的日志,但也是一个错误呢?另外,如果您可以批准我的修改,我会提出您的问题 –
按照书面,这个问题是不可能的。我可以理解,如果'name [j]'是未定义的,因为在运行executeScript回调的任何异步代码之前j最终会变成2(假设这是异步的),但是你说错误是'names'是未定义...这是不可能的 –
借调。这似乎是无稽之谈。我建议你尝试在JSFiddle中重新创建这个错误 - 我无法相信你所报告的错误确实在你描述的时候发生。 – AmericanUmlaut
我无法在jsfiddle上重现它,因为它使用了chrome web驱动程序。我甚至尝试过cloud9 ide,但那也没有奏效。 – Triven