2016-10-10 6 views
0

모든 동적 컨텐츠를로드하기 위해 웹 페이지 끝으로 스크롤 할 수있었습니다. 그러나이 작업을 수행 한 후에 일부 데이터를 얻으려면 페이지를 평가하고 싶습니다. 내 문제는 내가 단순한 것보다 다른 것을 실행하는 경우입니다.캐스퍼 JS 스크롤 다운 후 excecuting 평가 없음

casper.echo("something"); 

내 코드가 끊어지고 증서 데이터를받지 못합니다.

var casper = require('casper').create(); 
casper.start("http://mypageWithDynamicContentOnScroll.com"); 
var linksPrendas = []; 
casper.waitForSelector('#idOfDivContainingDynamicContent',function(){ 
    scrollNow(); 
}); 
var currentHeight; 
var page = 1; 
function scrollNow(){ 
    casper.scrollToBottom(); 
    casper.waitForSelector("#page"+page+"Height", function() { 
     casper.echo('scrolling...'); 
     page++; 
     scrollNow(); 
    }, 
    function _onTimeout(){ 

    }); 
} 

var data = ''; 
casper.then(function(){ 
    casper.echo('e'); 
    //data = __utils__.findOne('div#someId').textContent; 
    casper.echo('f'); 
    //var links = this.evaluate(function() { 
    // casper.echo("Evaluate "); 
    // var elements = __utils__.findAll('a'); 
    // return elements. map (function (e) { 
    //  return e.getAttribute('href'); 
    // }); 
    //}); 
}); 

casper.run(function(){ 

    // var data = casper.evaluate(function() { 
    //   var elements = __utils__.findAll('a.productListLink'); 
    //   return elements.map(function(e) { 
    //    return e.getAttribute('href'); 
    //   }); 
    //  casper.echo("Evaluate "); 
    //  return [1,2,3]; 
    // }); 
    casper.echo("Then"); 
    casper.echo(elements); 

    casper.echo("DONE").exit(); 

}); 

당신은 내가 어떤 성공없이 많은 다른 옵션을 시도 나의 주석 코드의 일부에서 볼 수있다 : 이것은 내 코드입니다. _onTimeout 콜백 안에 evaluate 또는 findAll을 배치하려고했습니다. 나도 코드를 깨고 "DONE"은 결코 인쇄되지 않거나 평가 안의 코드를 실행하지 않습니다.

스크롤이 잘 작동하고 스크롤하지 않고도 페이지를 평가하고 원하는 콘텐츠를 얻을 수 있습니다.

어떻게하면됩니까? 스크롤이 완료된 후 페이지를 평가 하시겠습니까?

당신에게

편집 감사합니다 나는 또한()가 호출 scrollNow 후 실행을() 계속 scrollNow에 콜백 함수를 통과 테스트 한 . 콜백이 호출되었지만 원하는 데이터를 얻기 위해 findAll 또는 다른 함수를 평가할 필요가 없습니다.

답변

1

casper 객체 casper.evaluate__utils__의 사용할 겉 casper.evaluate 내부에만 가능하다 이다. casper.echo(...)을 호출하면 TypeError가 발생하고 실행이 중지됩니다. 당신이 (casper.evaluate의 내부) 페이지 문맥에서 뭔가를 인쇄하려면

, 당신은 "remote.message" 이벤트에 등록해야합니다 : 다른

casper.on("remote.message", function(msg){ 
    this.echo(msg); 
}); 

... 
casper.evaluate(function(){ 
    console.log("something from the page"); 
}); 

모든 것이 잘 보인다.

+0

아름다운! 정보 주셔서 감사합니다 – Alejandro