17

现在我正在使用以下命令运行phantomJS

exec('./phantomjs table.js',$op,$er);

表.js

var page = require('webpage').create();
page.open('table.php', function () {
    page.render('table.png');
    phantom.exit();
});

这达到了目的。但现在我需要使用动态变量,即date. 那么是否可以在exec命令行中传递 PHP 或 Javascript 变量以便我可以在其中使用该变量table.js

更新

我尝试根据此处发布的解决方案修改我的代码通过 exec 将变量传递给 PhantomJS

exec('./phantomjs table.js http://www.yahoo.com',$op,$er);

表.js

var args = require('system').args;
var page = require('webpage').create();
var address = system.args[1];
    page.open(address, function () {
        page.render('table.png');
        phantom.exit();
    });

但这会导致两个问题:

  • 整个过程大约需要3-4分钟才能完成
  • 之后我收到“找不到服务器”消息

如果我删除修改后的代码,一切都会按预期工作。

更多调试

table.js里面我用了这个:

var args = require('system').args;
args.forEach(function(arg, i) {

    console.log(i+'::'+arg);

});

var page = require('webpage').create();
var address = 'http://www.gmail.com';
page.open(address, function () {
    page.render('github.png');
    phantom.exit();
});

运行此程序时,我的$op(来自exec命令)打印输出:

Array ( [0] => 0::table.js [1] => 1::http://www.yahoo.com )

到现在为止还挺好。但是我一放下面的代码,就遇到了同样的问题

var args = require('system').args;

var page = require('webpage').create();
var address = system.args[1]; // <--- This line is creating problem, the culprit
page.open(address, function () {
    page.render('github.png');
    phantom.exit();
}); 

似乎这不是正确的语法。有什么明显我看不到的吗?

4

3 回答 3

31

您的代码的问题是一个简单的疏忽。

您已经使用

var args = require('system').args;

因此,当您需要引用它们时,您只需执行以下操作:

var address = args[1];

“系统”的使用正在寻找一个完全不同的数组

于 2013-10-22T17:51:24.523 回答
3

我必须这样做,这个答案让我找到了我的最终答案,但是正如一些人在这里表达的那样,我的浏览器崩溃了......我发现了问题和解决方案,并且认为值得分享......

如果满足以下条件,这将非常有效:

exec('phantomjs phdemo.js http://google.com', $o, $e); ?>

var page = require('webpage').create();
var system = require('system');
var address = system.args[1]; 
page.open(address, function () {
    page.render('output.pdf');
    phantom.exit();
 }); 

但是,如果您想在 url 地址中传递多个参数,例如 google.com?searchteext&date=today,我发现字符 '&' 会使浏览器崩溃,因为它期望它作为不同的命令

我的解决方案是使用相同的方法,但我使用了 @ 符号而不是放置 &,因此 url 看起来像 google.com?searchteext@date=today

然后在另一端我添加了一个字符串替换

var address = address.replace(/@/gi,"&");

然后一切正常....可能还有其他方法可以做到这一点,但这对我来说非常有效

于 2013-12-10T12:50:25.860 回答
-2

好吧,我找到了上述问题的替代方法。而不是使用

var address = system.args[1];

我正在按照以下修改进行操作

var args = require('system').args;
var address = '';
args.forEach(function(arg, i) {

    if(i == 1)
    {
       address = arg;
    }

});

var page = require('webpage').create();    
page.open(address, function () { // <-- use that address variable from above
    page.render('github.png');
    phantom.exit();
});
于 2013-06-03T08:39:51.840 回答