7

我正在尝试使用CasperJS从 twitter 获取一些信息。我被无限滚动卡住了。问题是,即使使用 jquery 向下滚动页面似乎也没什么用。滚动,也没有触发确切的事件window(像 uiNearTheBottom 一样)似乎没有帮助。有趣的事情——在 FF 和 Chrome 中通过 js 控制台注入 JS 代码时,所有这些尝试都有效。这是示例代码:

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

或者

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

4 回答 4

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 滚动

于 2014-11-10T07:34:17.937 回答
2

CasperJs 基于 PhantomJS,根据下面的讨论,无头浏览器不存在窗口对象。

你可以在这里查看讨论

于 2013-07-08T07:41:54.967 回答
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();
    });
});
于 2014-05-04T19:51:36.567 回答
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()或更复杂的东西,但是加载时间不允许我做到这一点。

于 2015-08-20T23:51:06.440 回答