向下滚动后 CasperJS 评估不执行
CasperJS evaluate not excecuting after scrolling down
我已经能够滚动到网页末尾以加载所有动态内容。但是在这样做之后我想评估页面以获得一些数据。我的问题是如果我 运行 有什么不同于简单的
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();
});
你可以从我的一些注释代码中看到,我尝试了很多不同的选项但都没有成功。我还尝试将 evaluate 或 findAll 放在 _onTimeout 回调中。我要么破坏了代码并且 "DONE" 永远不会被打印出来,要么我永远无法在 evaluate 或其他任何东西中执行代码。
滚动效果很好,没有滚动我可以评估页面并获得想要的内容。
那么我怎样才能使它起作用呢?滚动完成后评估页面?
谢谢
编辑:
我还测试了将回调函数传递给 scrollNow() 以在调用 scrollNow() 后继续执行。回调被调用,但同样,评估 findAll 或任何其他函数来获取想要的数据都没有运气。
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");
});
其他一切看起来都很好。
我已经能够滚动到网页末尾以加载所有动态内容。但是在这样做之后我想评估页面以获得一些数据。我的问题是如果我 运行 有什么不同于简单的
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();
});
你可以从我的一些注释代码中看到,我尝试了很多不同的选项但都没有成功。我还尝试将 evaluate 或 findAll 放在 _onTimeout 回调中。我要么破坏了代码并且 "DONE" 永远不会被打印出来,要么我永远无法在 evaluate 或其他任何东西中执行代码。
滚动效果很好,没有滚动我可以评估页面并获得想要的内容。
那么我怎样才能使它起作用呢?滚动完成后评估页面?
谢谢
编辑: 我还测试了将回调函数传递给 scrollNow() 以在调用 scrollNow() 后继续执行。回调被调用,但同样,评估 findAll 或任何其他函数来获取想要的数据都没有运气。
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");
});
其他一切看起来都很好。