java - chrome - ¿Cómo configuro el selenium webdriver para obtener tiempo de espera?
selenium webdriver ruby (9)
Añadir
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
No hará nada. La página se bloqueará por un tiempo muy largo.
Cuando estoy usando un proxy en un controlador de web como FirefoxDriver, si el proxy es malo, el método get bloqueará para siempre. Configuré algunos parámetros de tiempo de espera, pero esto no funcionó.
Este es mi código:
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("general.useragent.override", ua);
Proxy p = new Proxy();
p.setHttpProxy(proxy);
profile.setProxyPreferences(p);
profile.setEnableNativeEvents(true);
// create a driver
WebDriver driver = new FirefoxDriver(profile);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
driver.get("www.sina.com.cn")
La llamada a driver.get se bloqueará para siempre, pero quiero que espere 30 segundos y si la página no está cargada, lanza una excepción.
Considero que las llamadas de tiempo de espera no son lo suficientemente confiables en la vida real, particularmente para Internet Explorer, sin embargo, las siguientes soluciones pueden ser de ayuda:
Puede superar el tiempo de la prueba completa usando @Test (timeout = 10000) en la prueba junit desde la que está ejecutando el proceso de selenio. Esto liberará el hilo principal para ejecutar las otras pruebas, en lugar de bloquear todo el espectáculo. Sin embargo, incluso esto no funciona a veces.
De todos modos, al agotar el tiempo de espera, no tiene intención de salvar el caso de prueba, porque el tiempo de espera, incluso una sola operación, puede dejar la secuencia de prueba completa en un estado incoherente. Es posible que solo desee continuar con los otros casos de prueba sin bloquear (o quizás vuelva a intentar la misma prueba de nuevo). En tal caso, un método infalible sería escribir un sondeador que sondee los procesos de Webdriver (por ejemplo, IEDriverServer.exe, Phantomjs.exe) ejecutándose durante más de 10 minutos y mátalos. Se puede encontrar un ejemplo en Identificar automáticamente (y matar) procesos con un largo tiempo de procesamiento
La solución de driver.manage (). Timeouts (). PageLoadTimeout (10, TimeUnit.SECONDS) funcionará en las páginas con carga de sincronización, pero esto no resuelve el problema en las páginas que cargan cosas en asynch, las pruebas fallarán todas el tiempo si configuramos el pageLoadTimeOut.
Los métodos de timeouts()
no se implementan en algunos controladores y son poco confiables en general.
Utilizo un hilo separado para los tiempos de espera (pasando la url para acceder como el nombre del hilo):
Thread t = new Thread(new Runnable()
{
public void run()
{
driver.get(Thread.currentThread().getName());
}
}, url);
t.start();
try
{
t.join(YOUR_TIMEOUT_HERE_IN_MS);
}
catch (InterruptedException e)
{ // ignore
}
if (t.isAlive())
{ // Thread still alive, we need to abort
logger.warning("Timeout on loading page " + url);
t.interrupt();
}
Esto parece funcionar la mayor parte del tiempo, sin embargo, puede suceder que el controlador realmente se atasque y cualquier llamada posterior al controlador se bloqueará (lo experimento con el controlador de Chrome en Windows). Incluso algo tan inocuo como una llamada a driver.findElements () podría terminar bloqueada. Desafortunadamente no tengo soluciones para los controladores bloqueados.
Prueba esto:
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
Puede establecer el tiempo de espera en el cliente HTTP como este
int connectionTimeout=5000;
int socketTimeout=15000;
ApacheHttpClient.Factory clientFactory = new ApacheHttpClient.Factory(new HttpClientFactory(connectionTimeout, socketTimeout));
HttpCommandExecutor executor =
new HttpCommandExecutor(new HashMap<String, CommandInfo>(), new URL(seleniumServerUrl), clientFactory);
RemoteWebDriver driver = new RemoteWebDriver(executor, capabilities);
Tuve el mismo problema y gracias a este foro y algunos otros encontraron la respuesta. Inicialmente, también pensé en un hilo separado, pero eso complica un poco el código. Así que traté de encontrar una respuesta que se alinee con mi principio "elegancia y simplicidad".
Por favor, eche un vistazo a dicho foro: https://sqa.stackexchange.com/questions/2606/what-is-seleniums-default-timeout-for-page-loading
#SOLUCIÓN: en el código, antes de la línea con el método ''get'' puede usar, por ejemplo:
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
#
Una cosa es que arroja timeoutException, por lo que tiene que encapsularlo en el bloque try catch o ajustar algún método.
No he encontrado el getter para pageLoadTimeout, así que no sé cuál es el valor predeterminado, pero probablemente sea muy alto, ya que mi script estuvo congelado durante muchas horas y nada avanzó.
#AVISO: ''pageLoadTimeout'' NO está implementado para el controlador de Chrome y, por lo tanto, causa una excepción. Vi por los usuarios que hay planes para hacerlo.
Usado debajo del código en una situación similar
driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
y el código embedded.get incrustado en una captura de prueba, que resolvió el problema de cargar páginas que tardaban más de 1 minuto.
tratar
driver.executeScript("window.location.href=''http://www.sina.com.cn''")
esta declaración volverá de inmediato.
Y después de eso, puede agregar un WebDriverWait con tiempo de espera para verificar si el título de la página o cualquier elemento está bien.
Espero que esto te ayudará.