2013-07-08 32 views
7

Tôi đang cố gắng lấy một số thông tin từ twitter bằng cách sử dụng CasperJS. Và tôi bị mắc kẹt với cuộn vô hạn. Vấn đề là ngay cả khi sử dụng jquery để di chuyển trang xuống các thông báo dường như hoạt động. Không cuộn, không kích hoạt sự kiện chính xác trên window (smth như uiNearTheBottom) dường như không hữu ích. Điều thú vị - tất cả những nỗ lực này hoạt động khi tiêm mã JS qua bảng điều khiển js trong FF & Chrome. Dưới đây là đoạn code ví dụ:CasperJS không thể kích hoạt cuộn vô hạn twitter

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

hoặc

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

Khi CasperJS tiêm jQuery vào trang phía máy khách, nó chặn nội dung được tải bởi cuộn vô hạn của Twitter. Đây là vấn đề cụ thể của trang web. Xin vui lòng xem câu trả lời của tôi dưới đây cho một giải pháp. – tfmontague

Trả lời

2

CasperJs được dựa trên PhantomJS và theo sau cuộc thảo luận không có đối tượng cửa sổ tồn tại cho trình duyệt không đầu.

Bạn có thể kiểm tra các cuộc thảo luận here

+0

Ít nhất, 'tài liệu' tồn tại trong ngữ cảnh trang. Và trong lần đầu tiên cuộn đang hoạt động. Nhưng tweet không tải. –

1

On Twitter bạn có thể sử dụng:

casper.scrollToBottom(); 
casper.wait(1000, function() { 
    casper.capture("loadedContent.png"); 
}); 

Nhưng nếu bạn bao gồm jQuery ..., các mã trên sẽ không hoạt động!

var casper = require('casper').create({ 
    clientScripts: [ 
     'jquery-1.11.0.min.js' 
    ] 
}); 

Chặn tập lệnh chặn cuộn vô hạn Twitter tải nội dung. Trên BoingBoing.net, CasperJS scrollToBottom() làm việc với jQuery mà không bị chặn. Nó thực sự phụ thuộc vào trang web.

Tuy nhiên, bạn có thể tiêm jQuery sau khi nội dung đã tải.

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(); 
    }); 
}); 
4

Nếu casper.scrollToBottom() thất bại bạn hoặc casper.scroll_to_bottom(), thì dưới đây sẽ phục vụ quý khách:

this.page.scrollPosition = {top: this.page.scrollPosition ["trên cùng"] + document.body.scrollHeight, left: 0};

Một ví dụ làm việc:

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"); 
    } 
})}); 

Nó sử dụng PhantomJS cơ bản di chuyển sang tìm thấy here

+0

Bạn có chắc 'document.body.scrollHeight' nằm trong ngữ cảnh Casper chứ không phải bên trong' casper.evaluate'? –

+1

@ArtjomB. Tôi đã thêm một mã làm việc.Trong thực tế, tôi hiện đang sử dụng nó trong một cào mà tôi đang làm. Nó liên quan đến việc gọi mã cơ bản như được tìm thấy trong PhantomJS. – iChux

+1

Hiện tại, có một bản sao hoạt động của quá trình xóa bỏ twitter với CasperJS tại https://gist.github.com/nwaomachux/35d1c424966fccd16ae1 – iChux

0

tôi đã áp dụng điều này từ 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.') 
}); 

Về cơ bản những gì xảy ra là tôi nhập trang ngữ cảnh, cuộn xuống dưới cùng và sau đó đợi 2 giây để nội dung bị lỗi quảng cáo. Rõ ràng là tôi muốn sử dụng các ứng dụng lặp đi lặp lại của casper.scrollToBottom() hoặc một cái gì đó phức tạp hơn, nhưng thời gian tải không cho phép tôi thực hiện điều này.

+0

khái niệm inifnite cuộn ở đâu? . bạn vừa lặp qua một vòng lặp. –

Các vấn đề liên quan