¿Cómo detener la carga de la página en firefox programáticamente?
selenium web-crawler (8)
Estoy ejecutando varias pruebas con WebDriver y Firefox.
Estoy encontrando un problema con el siguiente comando:
WebDriver.get(www.google.com);
Con este comando, WebDriver bloquea hasta que se activa el evento onload. Si bien esto normalmente toma segundos, puede llevar horas en sitios web que nunca terminan de cargarse.
Lo que me gustaría hacer es dejar de cargar la página después de un cierto tiempo de espera, simulando de alguna manera el botón de parada de Firefox.
Primero intenté ejecutar el siguiente código JS cada vez que intenté cargar una página:
var loadTimeout=setTimeout(/"window.stop();/", 10000);
Desafortunadamente esto no funciona, probablemente porque:
Debido al orden en que se cargan los scripts, el método stop () no puede detener el documento en el que está contenido desde la carga 1
ACTUALIZACIÓN 1: Intenté usar SquidProxy para agregar los tiempos de espera de conexión y solicitud, pero el problema persistió.
Una cosa rara que encontré hoy es que un sitio web que nunca dejó de cargar en mi máquina (FF3.6 - 4.0 y Mac Os 10.6.7) se cargó normalmente en otros navegadores y / o computadoras.
ACTUALIZACIÓN 2: El problema aparentemente puede resolverse diciéndole a Firefox que no cargue imágenes. con suerte, todo funcionará después de eso ...
Me gustaría que WebDriver tuviera un mejor controlador de Chrome para poder usarlo. ¡Firefox me está decepcionando todos los días!
ACTUALIZACIÓN 3: Selenium 2.9 agregó una nueva función para manejar los casos donde el controlador parece colgarse. Esto se puede usar con FirefoxProfile
siguiente manera:
FirefoxProfile firefoxProfile = new ProfilesIni().getProfile("web");
firefoxProfile.setPreference("webdriver.load.strategy", "fast");
Voy a publicar si esto funciona después de intentarlo.
ACTUALIZACIÓN 4: al final ninguno de los métodos anteriores funcionó. Termino "matando" los hilos que tardan mucho en terminar. Estoy planeando probar 1 que es un WebDriver remoto que usa PhantomJS como back-end. PhantomJS es un script de WebKit sin cabeza, por lo que espero no tener los problemas de un navegador real como Firefox. Para las personas que no están obligadas a usar Firefox (con fines de rastreo) actualizaré con los resultados
ACTUALIZACIÓN 5: Tiempo para una actualización. Usando durante 5 meses el ghostdriver 1.1 en lugar de FirefoxDriver, puedo decir que estoy muy contento con su rendimiento y estabilidad. Tengo algunos casos en los que no tenemos el comportamiento adecuado pero parece que, en general, Ghostdriver es lo suficientemente estable. Así que si necesita, como yo, un navegador para rastrear / rastrear en la red, le recomiendo que use el controlador fantasma en lugar de firefox y xvfb, lo que le dará varios dolores de cabeza ...
Una cosa rara que encontré hoy es que un sitio web que nunca deja de cargar en mi máquina (FF3.6 - 4.0 y Mac Os 10.6.7), deja de cargar NORMALMENTE en Chrome en mi máquina y también en otra Mac Os y Windows Las máquinas de algún colega mío!
Creo que el problema está estrechamente relacionado con los errores de Firefox. Vea esta publicación del blog para más detalles. Tal vez la actualización de FireFox a la última versión solucionará su problema. De todos modos, deseo ver la actualización de Selenium que simula el botón "detener" ...
Básicamente, configuro el tiempo de espera del navegador por debajo de mi centro de selenio y luego detecto el error. Y luego detenga la carga del navegador, luego continúe con la prueba.
webdriver.manage().timeouts().pageLoadTimeout(55000);
function handleError(err){
console.log(err.stack);
};
return webdriver.get(url).then(null,handleError).then(function () {
return webdriver.executeScript("return window.stop()");
});
Bueno, el siguiente concepto funcionó conmigo en Chrome, intente lo mismo:
1) Navegue a "about: blank" 2) obtenga el elemento "body" 3) en el elemento, simplemente envíe las claves Ësc
En caso de que alguien más se quede estancado con la misma molestia para siempre, puedes usar complementos simples como Killspinners para Firefox para hacer el trabajo sin esfuerzo.
Edit: esta solución no funciona si javascript es el problema. Entonces podrías ir por un script de Greasemonkey como:
// ==UserScript==
// @name auto kill
// @namespace default
// @description auto kill
// @include *
// @version 1
// @grant none
// ==/UserScript==
function sleep1() {
window.stop();
setTimeout(sleep1, 1500);
}
setTimeout(sleep1, 5000);
Fue un asunto realmente tedioso de resolver. Sin embargo, me pregunto por qué la gente lo está complicando. Acabo de hacer lo siguiente y el problema se resolvió (quizás haya recibido soporte recientemente):
driver= webdriver.Firefox()
driver.set_page_load_timeout(5)
driver.get(''somewebpage'')
Funcionó para mí usando el controlador de Firefox (y también el controlador de Chrome ).
Me he encontrado con el mismo problema, y no parece haber una solución general. Sin embargo, hay un error al respecto en su sistema de seguimiento de errores que podría "iniciar" para votar por él.
http://code.google.com/p/selenium/issues/detail?id=687
Uno de los comentarios sobre ese error tiene una solución que puede funcionar para usted: básicamente, crea un subproceso separado que espera el tiempo requerido y luego intenta simular la presión de escape en el navegador, pero eso requiere que la ventana del navegador esté al frente. , lo que puede ser un problema.
Mi solución es usar esta clase: WebDriverBackedSelenium
;
//When creating a new browser:
WebDriver driver = _initBrowser(); //Just returns firefox WebDriver
WebDriverBackedSelenium backedSelenuium =
new WebDriverBackedSelenium(driver,"about:blank");
//This code has to be put where a TimeOut is detected
//I use ExecutorService and Future<?> Object
void onTimeOut()
{
backedSelenuium.runScript("window.stop();");
}
Pude evitar esto haciendo algunas cosas.
Primero, establezca un tiempo de espera para el webdriver. P.ej,
WebDriver wd;
... initialize wd ...
wd.manage().timeouts().pageLoadTimeout(5000, TimeUnit.MILLISECONDS);
En segundo lugar, cuando realice su obtención, envuélvala alrededor de una TimeoutException. (Agregué una captura UnhandledAlertException allí solo por si acaso). Por ejemplo,
for (int i = 0; i < 10; i++) {
try {
wd.get(url);
break;
} catch (org.openqa.selenium.TimeoutException te) {
((JavascriptExecutor)wd).executeScript("window.stop();");
} catch (UnhandledAlertException uae) {
Alert alert = wd.switchTo().alert();
alert.accept();
}
}
Básicamente, esto intenta cargar la página, pero si se agota el tiempo de espera, obliga a la página a detener la carga a través de javascript y luego intenta volver a obtener la página. Puede que no sea de ayuda en su caso, pero definitivamente lo fue en el mío, especialmente cuando se ejecuta el getCurrentUrl()
un controlador getCurrentUrl()
, que también puede demorar mucho tiempo, tener una alerta y requerir que la página deje de cargarse antes de obtener la URL.