我试图避免进行20个左右的很小的测试,而每个测试实际上都是在测试一个白色标签站点列表并显示一些基本信息。
我有一个网站列表(数组),它们的URL,期望的标题和网站名称。
我想遍历数组,转到每个URL并验证标题是否正确。
像这样:
var x = require('casper').selectXPath;
var white_labels = [
{
URL: "http://site1.com",
Title: "Site 1 Title",
Name: "Site 1"
},
{
URL: "http://site2.com",
Title: "Site 2 Title",
Name: "Site 2"
}
]
casper.test.begin('White Labels Test Suite', white_labels.length, function suite(test) {
var urls;
var i = -1;
casper.start(white_labels[0]["URL"], function() {
urls = white_labels;
});
casper.then(function() {
this.each(urls, function() {
i++;
this.echo("I: " + i);
this.thenOpen(urls[i].URL, function() {
this.echo("URL: " + urls[i].URL);
test.assertTitle(urls[i].Title, urls[i].Name + " title is correct");
});
});
});
casper.run(function() {
test.done();
});
});
运行此命令时,每次我打印“ I”时,它都是正确的... 0,然后是1。
但是,第一个测试失败,因为它返回的标题是站点2的标题,而不是站点1的标题。第二个测试成功。
在这一点上,我感到困惑。
问题是的可变范围i
。casper.each
本质上是一个同步的for循环。它的内部是异步casper.thenOpen
语句,该语句仅调度一个动作。实际上,它是被同步调用的,并且正确的url被传递给它。each
执行循环后,casper步骤队列开始执行(通过触发casper.run
),其中包括所有then*
调用。
问题在于这i
是全局的,这意味着当两个casper.thenOpen
回调都最终执行时,两个回调都i
为1。
针对您的情况有不同的解决方案:
i++;
为var j = ++i;
和所有其他i
内部casper.each
进行j
。casper.each
将迭代项注入到迭代中的事实,并且根本不使用任何索引:this.each(urls, function(self, url) { ... });
。this.each
,以this.eachThen
使得它本身是阶梯状的,你没有i
-problems。最后,请参见循环内的JavaScript闭包-简单的实际示例和JavaScript闭包如何工作?欲获得更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句