我正在尝试编写一个单击更多按钮的步骤,直到该按钮变为display: none;
。
澄清:我正在使用的网页是Google+ business page。还有一个按钮,一次加载大约10个评论,直到它们全部加载。完成后,Google会将按钮设置为display: none;
我已经玩了很多不同的方法来实现它。现在我正在使用类似的东西:
这个不起作用,我确信有一种优雅的方法来实现这一目标。
casper.then(function() {
while (this.visible('.d-s.L5.r0')){
console.log("Click");
this.click('.d-s.L5.r0');
}
});
这个新代码正在运行,但是我必须设置它重复的次数,这是非常hacky:
casper.repeat(15, function() {
console.log("Click");
this.click('.d-s.L5.r0');
this.wait(400);
});
答案 0 :(得分:2)
您需要正确处理按钮的状态。通过单击 more 按钮,它将不可见,但在下一个项目加载之前,将显示另一个加载 span
。然后再次交换。您需要反映代码中的更改。
if (this.visible(moreButton)) { // synchronous
// asynchronous steps...
this.thenClick(moreButton);
this.waitUntilVisible(loadingButton);
this.waitUntilVisible(moreButton);
this.then(function(){
this.capture("business.png"); // overwrite the current screenshot
// recursion here
});
}
此外,最好将事物写为递归,因为在尝试这些步骤之前,您不知道步骤的数量。所以完整的代码将是:
var casper = require('casper').create({
waitTimeout: 10000,
viewportSize: {
width: 900,
height: 720
}
});
var moreButton = '[id*="about-page"] span.d-s.L5.r0',
loadingButton = moreButton + ' + span.dP.PA';
function clickMore(max, i){
i = i || 0;
if ((max == null || i < max) && this.visible(moreButton)) { // synchronous
// asynchronous steps...
this.thenClick(moreButton); // sometimes the click is not properly dispatched
this.waitUntilVisible(loadingButton);
this.waitUntilVisible(moreButton, null, function onTimeout(){
// only placeholder so that the script doesn't "die" here if the end is reached
});
this.then(function(){
this.capture("business_"+i+".png");
clickMore.call(this, max, i+1); // recursion
});
}
}
casper.start("https://plus.google.com/101200069268247335090/about?hl=en").then(function(){
clickMore.call(casper);
}).then(function(){
this.capture("business_end.png");
}).run(function(){
this.echo("DONE");
this.exit();
});
您还可以使用参数设置最大点击次数来调用clickMore
,如下所示:
clickMore.call(casper, 10);
问题仍然存在。有时不会调度点击 more 按钮。您应该探索点击该按钮的其他方法。