【发布时间】:2016-08-10 03:59:41
【问题描述】:
我正在通过对我的网站进行测试来学习 CasperJS,该测试从导航栏中抓取所有链接并循环打开它们并为每个页面运行一个小测试(检查标题,点击搜索按钮,请参阅如果结果回来等)。我还包括一个“快速测试”标志,它只会在转到下一个链接之前检查页面标题。总共大约有 25 个链接。
问题是脚本在大约 10 次完整测试后以某种方式卡住了,但在快速测试中运行良好。这是我用来打开每个页面的循环:
casper.each(linkList, function(self, link){
self.thenOpen(link, function(){
self.echo(link);
temp = Date.now();
this.open(urlPrefix + link);
this.then(function(){
temp = (Date.now()) - temp;
self.echo("Load time: "+temp.toString()+"ms");
switch(link){
//case statements for specific pages
// - run specialized versions of testPage()
case "Example":
testExample(this);
break;
default:
testPage(this);
break;
}
});
});
});
testPage() 和特定于页面的函数看起来都类似于:
function testPage(ths){
checkTitle(ths, "Page Title");
if(quickTest)
return;
ths.click('#searchButton');
casper.waitForSelectorTextChange("#results",function(){
temp = ths.evaluate(function(){
return $("tr.row").length;
});
if(temp>0)
casper.echo("Results returned");
else
casper.echo("No results returned");
});
}
checkTitle() 函数很简单:
function checkTitle(ths, name){
temp = ths.getTitle();
casper.echo("Page Title: "+temp+" - App loads: "+(temp==name ? "PASSED" : "FAILURE"));
}
现在,如果 quickTest 是 true 则循环结束,没有问题。如果quickTest 是false,则循环在第 12 页无限期挂起。巧合的是,第 11 页实际上是同一页,只是搜索过滤器的选项更多。此外,我的 casperjs 脚本告诉我,使用quickTest=false 加载页面需要 13410 毫秒,而使用quickTest=true 只需 460 毫秒,这令人困惑,因为没有从该标志跳过/添加两个时间戳之间的代码并在 IE 中加载页面几乎不需要那么长时间。
为什么casper在循环链接后变慢了?
【问题讨论】:
-
除了以三种不同的方式使用相同的全局变量 (
temp) 以及在testPage中使用casper而不是ths之外,此代码看起来不错。这可能是一些 PhantomJS 的限制。 -
@ArtjomB。使用
casper与本地实例(即ths)有区别吗? -
使用对
casper的全局引用或对同一个实例的封闭引用应该没有关系,但是开发人员可能会产生奇怪的想法并改变未来的行为。
标签: javascript phantomjs casperjs