Javascript 在CasperJS中测试URL列表
我试图避免进行20个左右的非常小的测试,每个测试基本上都测试一个白标签站点列表,并显示一些基本信息 我有一个网站列表(数组),它们的URL,预期的标题和网站的名称 我想迭代数组,转到每个URL并验证标题是否正确 像这样:Javascript 在CasperJS中测试URL列表,javascript,casperjs,Javascript,Casperjs,我试图避免进行20个左右的非常小的测试,每个测试基本上都测试一个白标签站点列表,并显示一些基本信息 我有一个网站列表(数组),它们的URL,预期的标题和网站的名称 我想迭代数组,转到每个URL并验证标题是否正确 像这样: var x = require('casper').selectXPath; var white_labels = [ { URL: "http://site1.com", Title: "Site 1 Title",
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。每个本质上是一个同步for循环。它的内部是asynchronouscasper.thenOpen
语句,它只调度一个操作。它实际上是同步调用的,并将正确的url传递给它。执行每个
循环后,casper步骤队列开始执行(通过casper.run
触发),其中包括所有然后*
调用
问题是i
是全局的,这意味着当两个casper.thenOpen
回调最终执行时,i
对它们都是1
对于您的案例,有不同的解决方案:
- 通过交换
i++,将每次迭代的索引固定到该迭代代码>对于
和var j=++i
内的所有其他i
casper。每个
用于
j
- 使用以下事实:
将迭代项注入迭代,并且根本不使用任何索引:casper.each
this.each(url,函数(self,url){…})代码>
- 最简单的方法就是将
这个。每个
都改成
这个。然后每个
都是步进的,这样就不会出现
-问题i
最后,有关更多信息,请参见和。问题在于
i
的可变范围<代码>casper。每个本质上是一个同步for循环。它的内部是asynchronouscasper.thenOpen
语句,它只调度一个操作。它实际上是同步调用的,并将正确的url传递给它。执行每个
循环后,casper步骤队列开始执行(通过casper.run
触发),其中包括所有然后*
调用
问题是i
是全局的,这意味着当两个casper.thenOpen
回调最终执行时,i
对它们都是1
对于您的案例,有不同的解决方案:
- 通过交换
i++,将每次迭代的索引固定到该迭代代码>对于
和var j=++i
内的所有其他i
casper。每个
用于
j
- 使用以下事实:
将迭代项注入迭代,并且根本不使用任何索引:casper.each
this.each(url,函数(self,url){…})代码>
- 最简单的方法就是将
这个。每个
都改成
这个。然后每个
都是步进的,这样就不会出现
-问题i
最后,有关更多信息,请参阅和。工作非常出色!最糟糕的是我不得不把你的回答读成“精通Javascript”!呃…真相有时会伤人。非常感谢。工作得很有魅力!最糟糕的是我不得不把你的回答读成“精通Javascript”!呃…真相有时会伤人。非常感谢。