如何在CasperJS中创建一个简单的循环来循环遍历页面上的不同操作

时间:2016-10-18 20:30:33

标签: javascript casperjs

我有这个脚本

var i=0;
casper.start('http://www.example.com');
casper.then(function() {    
    this.sendKeys('#search_field', i);
    this.click('input.vtop')
}); 

casper.then(function() {
    description = this.fetchText('h2').trim();
    description_longue = this.fetchText('#parent-longtext-body').trim();
    price = this.fetchText("td.nowrap strong").trim();
})    

casper.then(function() {
    this.capture('site'+'i'+'.png');
});

casper.viewport(1024, 768);
casper.run();

我想将i从0循环到5.如何做到这一点? 简单的for(i=0;i<5;<++)不起作用!

3 个答案:

答案 0 :(得分:1)

使用each声明:

casper.start().each(links, function(self, link) {
    self.thenOpen(link, function() {
        this.echo(this.getTitle());
    })
})

repeat

casper.start().repeat(5, function() {
    this.echo("Badger");
})

答案 1 :(得分:1)

循环完美无缺。您只需要记住,所有then*wait*函数(以及其他一些函数)都是异步的。您可以使用IIFE将迭代变量绑定到某个迭代:

casper.start();
casper.viewport(1024, 768);

for(var i = 0; i < 5; i++){
    (function(i){
        casper.thenOpen('http://www.example.com');
        casper.then(function() {    
            this.sendKeys('#search_field', i);
            this.click('input.vtop')
        }); 

        casper.then(function() {
            description = this.fetchText('h2').trim();
            description_longue = this.fetchText('#parent-longtext-body').trim();
            price = this.fetchText("td.nowrap strong").trim();
        })    

        casper.then(function() {
            this.capture('site'+'i'+'.png');
        });
    })(i);
}

casper.run();

有关详情,请参阅此处:JavaScript closure inside loops – simple practical example

此外,casper.startcasper.run只能在脚本中出现一次。

答案 2 :(得分:0)

您只需要将所有步骤放在一个以i为参数的函数中。你可能有太早捕获的问题,所以这里有一个简单的例子添加.wait,希望它有所帮助: - )

casper.then(function() { 
for (i=0; i<6; i++) { 
    this.wait(1000, (function(j) { 
        return function() {
            this.sendKeys('#YourId', 'number'+ j , {reset: true});  
            this.capture("image"+j+".jpg");
        }; 
    })(i));
}

});