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();
});
Похоже, что это не правильный синтаксис. Что-нибудь очевидное, что я не могу видеть?
Ответы
Ответ 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,"&");
Тогда все работает отлично... Могут быть другие способы сделать это, но это отлично сработало для меня