Casperjs通过链接减慢循环

时间:2016-08-09 19:00:43

标签: javascript phantomjs casperjs

我通过对我的网站进行测试来学习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"));
}

现在,如果quickTesttrue,则循环结束,没有问题。如果quickTestfalse,则循环会在第12页无限期挂起。巧合的是,第11页实际上是同一页面,只是有更多的搜索过滤器选项。另外,我的casperjs脚本告诉我用quickTest=false加载页面13410ms,用quickTest=true加载只有460ms,这是令人困惑的,因为从该标志跳过/添加了两个时间戳之间的代码并加载IE浏览器中的页面并不需要那么长时间。

为什么在循环链接后casper会减慢?

1 个答案:

答案 0 :(得分:1)

我设法偶然发现了this page。看来在这个过程中的某个地方存在内存泄漏。虽然我仍然不熟悉casperjs和phantomjs,但我猜它会涉及循环中的this.open()位。我通过添加以下内容设法完成所有测试:

casper.page.close();
casper.page = casper.newPage();

所以循环代码的开头现在看起来像:

casper.each(linkList, function(self, link){
    self.thenOpen(link, function(){
        self.echo(link);
        casper.page.close();
        casper.page = casper.newPage();
        temp = Date.now();
        this.open(urlPrefix + link);
        ......