我的目标是通过使用以下命令执行PhantomJS:
// adding $op and $er for debugging purposes
exec('phantomjs script.js', $op, $er);
print_r($op);
echo $er;
然后在
script.js
内部,我计划使用多个page.open()
捕获不同页面的屏幕截图,例如:var url = 'some dynamic url goes here';
page = require('webpage').create();
page.open(url, function (status) {
console.log('opening page 1');
page.render('./slide1.png');
});
page = require('webpage').create();
page.open(url, function (status) {
console.log('opening page 2');
page.render('./slide2.png');
});
page = require('webpage').create();
page.open(url, function (status) {
console.log('opening page 3');
page.render('./slide3.png');
phantom.exit(); //<-- Exiting phantomJS only after opening all 3 pages
});
在运行
exec
时,我在页面上获得以下输出:Array ( [0] => opening page 3 ) 0
结果,我仅获得第三页的屏幕截图。我不确定PhantomJS为什么跳过第一和第二代码块(从应该从第一和第二块输出的
console.log()
消息中丢失)而仅执行第三代码块。 最佳答案
问题是第二个page.open
在第一个page.open
完成之前被调用,这可能会导致多个问题。您需要大致类似于以下内容的逻辑(假设文件名作为命令行参数给出):
function handle_page(file){
page.open(file,function(){
...
page.evaluate(function(){
...do stuff...
});
page.render(...);
setTimeout(next_page,100);
});
}
function next_page(){
var file=args.shift();
if(!file){phantom.exit(0);}
handle_page(file);
}
next_page();
是的,它是递归的。这样可以确保传递到ojit_code的函数的处理在进入下一个文件之前以100ms的宽限期完成。
顺便说一句,您不需要继续重复
page = require('webpage').create();