我的目标是通过使用以下命令执行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();

09-17 14:38