我想找到解决这个问题的方法。
这是我的casperjs应用程序的一部分:
var page = 1;
function getLinks() {
var links = __utils__.getElementsByXPath('//div[@class="myDiv"]//a');
return Array.prototype.map.call(links, function(e) {
return e.getAttribute('href')
});
}
casper.start("www.example.com", function(){
//
})
casper.repeat(2, function() {
this.then(function(){
links = this.evaluate(getLinks);
links = links.concat(links);
});
this.then(function(){
page++;
this.clickLabel(String(page), 'a');
});
});
如你所见,我有两个重复步骤。我设置了2因为我只需要检查两页。
目前我的问题是“点击”。它有效,因为调用了新的Url,但问题是第一步将立即执行,因此新内容未完全加载。所以,当我再次调用getLinks()时,我仍然会处理以前的内容。
当页面完全加载时,我显然想要获取链接。我该怎么办?
谢谢!
答案 0 :(得分:0)
在检索如下链接之前,您可以添加wait
:
casper.repeat(2, function() {
this.wait(2000); // 2 seconds
this.then(function(){
links = this.evaluate(getLinks);
links = links.concat(links);
});
this.then(function(){
page++;
this.clickLabel(String(page), 'a');
});
});
您还可以在单击后附加waitForResource
以确保页面已加载。我在此假设页码位于URL内page=x
:
casper.repeat(2, function() {
this.then(function(){
links = this.evaluate(getLinks);
links = links.concat(links);
});
this.then(function(){
page++;
this.clickLabel(String(page), 'a');
});
this.waitForResource(new RegExp("page="+page));
});
答案 1 :(得分:-1)
常见问题解答如何延迟某些代码,以便虚拟浏览器有时间加载和/或呈现页面上的点击或其他JavaScript操作的结果?
window.setTimeout(
function () {
// process page here
},
2000 // number of milliseconds to wait (here 2s)
);
很简单,不是吗!在你的情况下,你会:
do_click();
window.setTimeout(
function () { process_click_result(); },
2000 // 2 seconds
);