PhantomJS - передать аргумент файлу JS - программирование
Подтвердить что ты не робот

PhantomJS - передать аргумент файлу JS

Сейчас я использую следующую команду для запуска phantomJS

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

table.js

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

Это служит цели. Но теперь мне нужно работать с динамической переменной, а именно date. Так можно ли передать переменную PHP или Javascript внутри командной строки exec, чтобы я мог использовать эту переменную внутри table.js?

Update

Я попытался изменить свой код в соответствии с решением, опубликованным здесь Передача переменной в PhantomJS через exec

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

table.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();
}); 

Похоже, что это не правильный синтаксис. Что-нибудь очевидное, что я не могу видеть?

4b9b3361

Ответ 1

Ну, я нашел альтернативу вышеупомянутой проблеме. Вместо использования

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();
});

Ответ 2

Проблема с вашим кодом - это простой надзор.

Вы уже сохранили аргументы, используя

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

Поэтому, когда вам нужно ссылаться на них, вам нужно только сделать:

var address = args[1];

Использование "системы" выполняется в совершенно другом массиве

Ответ 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();
 }); 

Однако, если вы хотите передать больше, чем une-параметр в URL-адресе, например google.com?searchteext&date=today, я обнаружил, что символ '&' сбой браузера, поскольку он ожидает его как другую команду

Мое решение состояло в том, чтобы использовать то же самое, но вместо того, чтобы помещать, и я использовал знак @, чтобы URL-адрес выглядел бы как [email protected]=today

то на другом конце я добавил строку replace

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

Тогда все работает отлично... Могут быть другие способы сделать это, но это отлично сработало для меня