【问题标题】:Casperjs slowing down looping through linksCasperjs减慢通过链接循环
【发布时间】: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"));
}

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

为什么casper在循环链接后变慢了?

【问题讨论】:

  • 除了以三种不同的方式使用相同的全局变量 (temp) 以及在 testPage 中使用 casper 而不是 ths 之外,此代码看起来不错。这可能是一些 PhantomJS 的限制。
  • @ArtjomB。使用casper 与本地实例(即ths)有区别吗?
  • 使用对casper的全局引用或对同一个实例的封闭引用应该没有关系,但是开发人员可能会产生奇怪的想法并改变未来的行为。

标签: javascript phantomjs casperjs


【解决方案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);
        ......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2021-04-23
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多