Estoy trabajando para integrar el navegador sin cabeza PhantomJS en un proyecto mío (actualmente usando la versión 1.6). En su mayor parte, está haciendo un gran trabajo al lograr lo que necesito lograr. Sin embargo, la naturaleza asíncrona de la forma en que funcionan las llamadas a WebPage.open(), y la necesidad de llamar a phantom.exit() en algún momento, hace que sea difícil manejar los redireccionamientos del lado del cliente cuando no se puede anticipar hacia dónde se dirigen. ir.Cómo finalizar un script PhantomJS solo después de que se han producido redirecciones del lado del cliente
Lo que estoy buscando es una forma de llamar a phantom.exit() solo después de cualquier meta actualización (que conduzca a una página diferente) y se han ejecutado los redireccionamientos de JavaScript ligados a eventos como onload. Puedo ver por qué esto es un problema, porque en teoría una redirección del lado del cliente podría tener lugar segundos después de la carga de una página, y no puedo simplemente pedir la posibilidad de salir solo cuando no hay más redirecciones que van a tener lugar. En este momento, la mejor solución que puedo pensar es a) detectar manualmente la presencia de metarefrigerar los elementos en la página y lidiar con ellos, yb) usar setInterval() para permitir una cierta cantidad de tiempo (por ejemplo, 1- 1.5 segundos) para que transcurra antes de llamar a phantom.exit(). Sería básicamente el siguiente aspecto:
var page = require('webpage').create();
var visitComplete = false;
var url = "http://some.url";
var pageOpenedTime;
setInterval(function() {
if (visitcomplete && typeof pageOpenedTime != 'undefined' &&
new Date() - pageOpenedTime >= 1500)
{
phantom.exit();
}
), 1000);
page.open(url, function() {
pageOpenedTime = new Date();
if (!hasMetaRefresh(page)) {
visitComplete = true;
}
});
function hasMetaRefresh(page) {
// Query the DOM here to detect meta refresh elements
}
mejor idea?
Editar: Debo mencionar que mi primer pensamiento fue que podría haber un evento PhantomJS que se dispara cuando se ha ejecutado el JavaScript asociado con la carga de la página inicial, pero la devolución de llamada onLoadFinished parece preceder a la ejecución de cualquier JavaScript de la página, incluidos los eventos de carga. También realicé algunas pruebas acerca de cuánto de un intervalo podría necesitar esperar, y mientras que 1000 ms fue suficiente para un redireccionamiento de JavaScript (a través del evento de carga del cuerpo) para ser ejecutado en una página de prueba pequeña, 100 ms no fue lo suficientemente largo.
Usé el mismo enfoque en mi proyecto, es deciragregó una pequeña pausa entre llamadas. Me temo que es la única opción (por ahora). –