javascript - navegador - phantomJS-Pasar argumento al archivo JS
phantom script (3)
Bueno, he encontrado una alternativa al problema anterior. En lugar de usar
var address = system.args[1];
Lo estoy haciendo siguiendo la modificación a continuación.
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();
});
Ahora mismo estoy usando el siguiente comando para ejecutar 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();
});
Esto sirve al propósito. Pero ahora estoy obligado a trabajar con una variable dinámica, a saber, la date
. Entonces, ¿es posible pasar una variable de PHP o Javascript dentro de la línea de comandos de exec
para que pueda usar esa variable dentro de table.js
?
Actualizar
Intenté modificar mi código de acuerdo con una solución publicada aquí Pasando una variable a PhantomJS a través de 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();
});
Pero esto resulta en 2 problemas:
- Todo el proceso tarda unos 3-4 minutos para terminar
- Después de eso recibo el mensaje "Servidor no encontrado"
Si elimino el código modificado, todo funciona como se espera.
Más depuración
Dentro de table.js usé esto:
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();
});
Al ejecutar esto, mi $op
(del comando exec
) imprimió esto:
Array ( [0] => 0::table.js [1] => 1::http://www.yahoo.com )
Hasta ahora tan bueno. Pero tan pronto como coloco el siguiente código, se encuentran los mismos problemas.
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();
});
Parece que esa no es la sintaxis correcta. ¿Algo obvio que no pueda ver?
El problema con su código es un simple descuido.
Ya has almacenado los argumentos utilizando
var args = require(''system'').args;
Así que cuando necesitas hacer referencia a ellos solo tienes que hacer:
var address = args[1];
El uso de "sistema" se ve en una matriz completamente diferente
Tenía que hacer esto y estas respuestas me indicaron que encontrara mi respuesta final. Sin embargo, como algunas personas expresaron aquí, mi navegador se estaba bloqueando ... Encontré el problema y la solución y pensé que valía la pena compartirlo ...
Esto funcionará perfectamente bien si:
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();
});
Sin embargo, si desea pasar más de un parámetro en la dirección url, por ejemplo, google.com?searchteext&date=today, descubrí que el carácter ''&'' bloquea el navegador porque lo espera como un comando diferente.
Mi solución fue usar el mismo pero en lugar de poner & usé el signo @ para que la url se vea como google.com?searchteext@date=today
luego en el otro extremo he añadido una cadena de reemplazo
var address = address.replace(/@/gi,"&");
Entonces, todo funciona perfectamente bien ... Puede haber otras formas de hacerlo, pero esto funcionó perfectamente para mí.