如何在 casperjs 中进行循环
How to for loop in casperjs
我正在尝试单击"下一步"按钮N次,每次都抓取页面源代码。 我知道我可以在远程网站上运行任意函数,所以我只使用远程函数 nextPage() 而不是 click() 如何运行以下内容,任意次数:
var casper = require('casper').create();
casper.start('http://www.example.com', function() {
this.echo(this.getHTML());
this.echo('-------------------------');
var numTimes = 4, count = 2;
casper.repeat(numTimes, function() {
this.thenEvaluate(function() {
nextPage(++count);
});
this.then(function() {
this.echo(this.getHTML());
this.echo('-------------------------');
});
});
});
这里的"i"是我试图在javascript for loop中使用的索引。
所以 tl;dr:我想舔'下一个',打印页面源,点击"下一步",打印页面源,点击"下一步"...继续N次。
首先,您可以将一个值传递给远程页面上下文(即thenEvaluate
像这样函数:
this.thenEvaluate(function(remoteCount) {
nextPage(remoteCount);
}, ++count);
但是,Casper#repeat
可能不是一个适合在此处使用的功能,因为循环不会等待每个页面加载然后捕获内容。
您可能更愿意设计一个基于事件的链接。
代码的工作流程将是:
有一个全局变量(或至少一个可供下面提到的函数访问的变量)来存储
count
和limit
。收听
load.finished
事件并在此处获取 HTML,然后调用下一页。
简化的代码可以是:
var casper = require('casper').create();
var limit = 5, count = 1;
casper.on('load.finished', function (status) {
if (status !== 'success') {
this.echo ("Failed to load page.");
}
else {
this.echo(this.getHTML());
this.echo('-------------------------');
}
if(++count > limit) {
this.echo ("Finished!");
}
else {
this.evaluate(function(remoteCount) {
nextPage(remoteCount);
// [Edit the line below was added later]
console.log(remoteCount);
return remoteCount;
}, count);
}
});
casper.start('http://www.example.com').run();
注意:如果您的页面具有高负载的JS进程等,您可能还需要在调用nextPage之前添加
wait
:
this.wait(
1000, // in ms
function () {
this.evaluate(function(remoteCount) {
nextPage(remoteCount);
}, count);
}
);
[编辑已添加] 以下事件侦听器将帮助您进行调试。
// help is tracing page's console.log
casper.on('remote.message', function(msg) {
console.log('[Remote Page] ' + msg);
});
// Print out all the error messages from the web page
casper.on("page.error", function(msg, trace) {
casper.echo("[Remote Page Error] " + msg, "ERROR");
casper.echo("[Remote Error trace] " + JSON.stringify(trace, undefined, 4));
});
你可以尝试使用Casper#repeat
在大多数情况下,这应该可以满足您的需求:
var numTimes = 10, count = 1;
casper.repeat(numTimes, function() {
this.thenEvaluate(function(count) {
nextPage(count);
}, ++count);
this.then(function() {
this.echo(this.getHTML());
this.echo('-------------------------');
});
});
var global_page_links = [];
casper.then(function(){
for(var i=1; i<=5; i++){
// you just add all your links to array, and use it in casper.each()
global_page_links.push(YOUR_LINK);
}
this.each(global_page_links, function(self, link) {
if (link){
self.thenOpen(link, function() {
console.log("OPENED: "+this.getCurrentUrl());
// do here what you need, evaluate() etc.
});
}
});
});
这是问题的答案,如何在casperjs中使用for()来启动几个链接
相关文章:
- CasperJS在每个URL中循环
- CasperJS-如何治疗'单击'在一个循环中
- 如何在casperjs中运行具有特定间隔的循环
- 如何告诉CasperJS循环浏览一系列页面
- 从casperjs中的内部重复循环转义
- CasperJS循环加载下一页
- CasperJs:单击循环中的链接以打开模式弹出窗口
- CasperJS只从我的for循环中多次发布最后一项
- 如何让 casperjs 重复循环,直到满足某个条件
- 如何在 casperjs 中进行循环
- 循环的CasperJS为每次迭代生成相同的结果
- 如何循环浏览每个图像并在casperjs脚本中检查其是否存在错误
- CasperJS循环没有正确计算,显然只是直接运行
- CasperJS中的For循环
- 在CasperJS中发送Ajax请求并循环结果
- 如何在CasperJS中创建一个简单的循环来遍历页面上的不同操作
- CasperJS在require或其他函数的循环中动态地包含testfile
- 如何在CasperJS中异步单击时停止循环
- 如何在CasperJS中对多个页面进行嵌套循环
- 如何在CasperJS中做出正确的循环