Javascript for循环中的Nightwatch execute命令运行异常
我对单元测试还很陌生,但我一直在尝试使用Nightwatch创建一个脚本,该脚本将遍历页面的主体内容,单击每个链接,并报告是否已损坏 我试图创建一个for循环,循环遍历主体内容中的每个标记,计算其中包含的“a”标记的数量,然后单击每个标记,但是每当我在for循环中使用browser.execute命令时,脚本就会无序执行 这是我的密码。我加入了几个console.log语句,试图弄清楚发生了什么:Javascript for循环中的Nightwatch execute命令运行异常,javascript,selenium,for-loop,iteration,nightwatch.js,Javascript,Selenium,For Loop,Iteration,Nightwatch.js,我对单元测试还很陌生,但我一直在尝试使用Nightwatch创建一个脚本,该脚本将遍历页面的主体内容,单击每个链接,并报告是否已损坏 我试图创建一个for循环,循环遍历主体内容中的每个标记,计算其中包含的“a”标记的数量,然后单击每个标记,但是每当我在for循环中使用browser.execute命令时,脚本就会无序执行 这是我的密码。我加入了几个console.log语句,试图弄清楚发生了什么: 'Click Links' : function(browser) { browser //C
'Click Links' : function(browser) {
browser
//Count all tags (p/div) in content that aren't links
.useCss()
.execute(function() {
return document.querySelectorAll("div.field-item.even *:not(a)").length;
},
function(tags){
tag_total = tags.value;
//Loop through every tag in content & check every a tag contained within
for (var x = 1; x < tag_total+1; x++) {
console.log("x val before execute: " + x);
browser.execute(function() {
return document.querySelectorAll("div.field-item.even *:not(a):nth-child(" + x + ") a").length;
},
function(links){
console.log("x val at start of execute: " + x);
a_total = links.value;
for (var y = 1; y < a_total+1; y++) {
browser.click("div.field-item.even *:not(a):nth-child(" + x + ") a:nth-child(" + y + ")");
browser.pause(1000);
//Conditionals for on-site 404/403 links
browser.execute(function() {
return document.querySelector("meta[content='Error Document']");
},
//Grabs url if link is broken
function(result){
if (result.value != null) {
browser.url(function(result) {
console.log("BROKEN LINK: " + result.value);
});
}
});
//Go back to previous page
browser.url(process.argv[2]);
browser.pause(1000);
}
console.log("x val at end of execute: " + x);
});
console.log("x val at end of for loop: " + x);
}
})
.end()
}
似乎for循环正在运行并跳过整个browser.execute块。循环完成后,输入browser.execute块时,x的数字无效,为3
为什么browser.execute命令会导致for循环无序执行,并且可以采取任何措施来修复它,使其按预定顺序运行?这与Nightwatch无关,但与Javascript有关 当您有一个循环并调用该循环中的函数时,该函数中使用的变量将通过引用保存。换句话说,任何函数的变量都不会改变 如果我们看一个简单的例子,会更容易:
var myFuncs = [];
for (var i = 0; i < 3; i += 1) {
myFuncs.push(function () {
console.log('i is', i);
});
}
myFuncs[0](); // i is 3
myFuncs[1](); // i is 3
myFuncs[2](); // i is 3
如果您想进一步探讨这个概念,可以看看这个(讽刺的是,它有一个非常类似的示例)。这与Nightwatch无关,但与Javascript有关 当您有一个循环并调用该循环中的函数时,该函数中使用的变量将通过引用保存。换句话说,任何函数的变量都不会改变 如果我们看一个简单的例子,会更容易:
var myFuncs = [];
for (var i = 0; i < 3; i += 1) {
myFuncs.push(function () {
console.log('i is', i);
});
}
myFuncs[0](); // i is 3
myFuncs[1](); // i is 3
myFuncs[2](); // i is 3
如果你想进一步探讨这个概念,你可以看看这个(讽刺的是,它有一个非常相似的例子)。非常感谢。完美地回答了问题并澄清了问题。只是想知道;在Nightwatch脚本中按语法格式化此解决方案的最佳方式是什么?您能为每个单独的函数创建一个自定义命令吗?非常感谢。完美地回答了问题并澄清了问题。只是想知道;在Nightwatch脚本中按语法格式化此解决方案的最佳方式是什么?是否为每个单独的函数创建自定义命令?
function log (i) {
return function () {
console.log(i);
}
}
var myFuncs = [];
for (var i = 0; i < 3; i += 1) {
myFuncs.push(log(i));
}
myFuncs[0](); // i is 0
myFuncs[1](); // i is 1
myFuncs[2](); // i is 2