我有两个代码示例如下:
var page = require('webpage').create();
page.open('https://www.youtube.com', function(s) {
console.log(s);
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
var t = page.evaluate(function() {
console.log('here');
phantom.exit(); // case 1: inside page.evaluate()
});
});
});
- >在这种情况下,phantom.exit()放在page.evaluate()中,并出现错误:" ReferenceError:找不到变量:phantom"
var page = require('webpage').create();
page.open('https://www.youtube.com', function(s) {
console.log(s);
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
var t = page.evaluate(function() {
console.log('here');
});
phantom.exit(); // case 2: outside page.evaluate()
});
});
- >在案例2中:将phantom.exit()放在page.evaluate()之外。没有错误,但是在这里'没有打印出来。
=>以上两种方式都不能打印出来这里'。是否有任何有效的方式来打印' here'没有错误?
答案 0 :(得分:4)
您不能在页面内部使用任何phantom
方法,就像页面本身无法使用它们一样。
phantom
对象是运行时提供给它最初启动的脚本的特殊主机对象。加载页面后,页面将在其自己的上下文中使用通常的浏览器变量运行,这些变量不包括phantom
。
您需要等待page.evaluate
回复虚拟脚本,然后从那里调用exit
。幻影docs show this exact case,在exit
返回后调用evaluate
。它们似乎没有涵盖evaluate
是否阻挡,但是示例表明它可能是阻塞的。
要从页面捕获日志消息,您需要订阅其onConsoleMessage
event。 Phantom控制台仅从正在运行的脚本中获取消息,而不是从可能加载的任何页面中获取消息。您需要做的就是将页面消息路由到幻像控制台:
page.onConsoleMessage = function(msg) {
console.log('PAGE: ' + msg);
};
答案 1 :(得分:-1)
尝试返回所需的数据并在评估后执行console.log()
实施例
var page = require('webpage').create();
page.open('https://www.youtube.com', function(s) {
console.log(s);
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
var t = page.evaluate(function() {
return "here";
});
console.log(t);
phantom.exit(); // case 2: outside page.evaluate()
});
});