CasperJS无法触发twitter无限滚动

时间:2013-07-08 07:23:10

标签: phantomjs infinite-scroll casperjs

我正在尝试使用 CasperJS 从Twitter获取一些信息。我被无限卷轴所困扰。问题是即使使用jquery滚动页面也没什么作用。既不滚动也不触发window上的确切事件(像uiNearTheBottom一样)似乎没有帮助。 有趣的事情 - 所有这些尝试都可以在FF& s中通过js控制台注入JS代码时起作用。铬。 这是示例代码:

casper.thenEvaluate(function(){
    $(window).trigger('uiNearTheBottom');
});

casper.thenEvaluate(function(){
    document.body.scrollTop  =  document.body.scrollHeight;
});

4 个答案:

答案 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)

我从a previous answer

采用了此功能
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()或更复杂的东西的重复应用,但加载时间并不允许我实现这一点。