我正在尝试使用 CasperJS 从Twitter获取一些信息。我被无限卷轴所困扰。问题是即使使用jquery滚动页面也没什么作用。既不滚动也不触发window
上的确切事件(像uiNearTheBottom一样)似乎没有帮助。
有趣的事情 - 所有这些尝试都可以在FF& s中通过js控制台注入JS代码时起作用。铬。
这是示例代码:
casper.thenEvaluate(function(){
$(window).trigger('uiNearTheBottom');
});
或
casper.thenEvaluate(function(){
document.body.scrollTop = document.body.scrollHeight;
});
答案 0 :(得分:4)
如果casper.scrollToBottom()失败了你或casper.scroll_to_bottom(),那么下面的那个将为你服务:
this.page.scrollPosition = {top:this.page.scrollPosition [" top"] + document.body.scrollHeight,left:0};
一个工作示例:
casper.start(url, function () {
this.wait(10000, function () {
this.page.scrollPosition = { top: this.page.scrollPosition["top"] + document.body.scrollHeight, left: 0 };
if (this.visible("div.load-more")) {
this.echo("I am here");
}
})});
它使用找到的基础PhantomJS滚动here
答案 1 :(得分:2)
CasperJs基于PhantomJS,根据以下讨论,无头浏览器不存在窗口对象。
您可以查看讨论here
答案 2 :(得分:1)
在Twitter上,您可以使用:
casper.scrollToBottom();
casper.wait(1000, function () {
casper.capture("loadedContent.png");
});
但是如果你包含jQuery ......,上面的代码将不起作用!
var casper = require('casper').create({
clientScripts: [
'jquery-1.11.0.min.js'
]
});
脚本注入阻止了Twitter加载内容的无限滚动。在BoingBoing.net上,CasperJS scrollToBottom()可以在不阻塞的情况下使用jQuery。这真的取决于网站。
但是,您可以在加载内容后注入jQuery。
casper.scrollToBottom();
casper.wait(1000, function () {
casper.capture("loadedContent.png");
// Inject client-side jQuery library
casper.options.clientScripts.push("jquery.js");
// And use like so...
var height = casper.evaluate(function () {
return $(document).height();
});
});
答案 3 :(得分:0)
var iterations = 5; //amount of pages to go through
var timeToWait = 2000; //time to wait in milliseconds
var last;
var list = [];
for (i = 0; i <= iterations; i++) {
list.push(i);
}
//evaluate this in the browser context and pass the timer back to casperjs
casper.thenEvaluate(function(iters, waitTime) {
window.x = 0;
var intervalID = setInterval(function() {
console.log("Using setInternal " + window.x);
window.scrollTo(0, document.body.scrollHeight);
if (++window.x === iters) {
window.clearInterval(intervalID);
}
}, waitTime);
}, iterations, timeToWait);
casper.each(list, function(self, i) {
self.wait(timeToWait, function() {
last = i;
this.echo('Using this.wait ' + i);
});
});
casper.waitFor(function() {
return (last === list[list.length - 1] && iterations === this.getGlobal('x'));
}, function() {
this.echo('All done.')
});
基本上发生的是我进入页面上下文,滚动到底部,然后等待2秒钟以加载内容。显然我会喜欢使用casper.scrollToBottom()
或更复杂的东西的重复应用,但加载时间并不允许我实现这一点。