La combinación de espera implícita y espera explícita en conjunto da como resultado tiempos de espera inesperados

Mis dos escenarios –

1 primero

@driver.manage.timeouts.implicit_wait = 30 @wait = Selenium::WebDriver::Wait.new(:timeout => 45) # Time greater than implicit @wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")} 

Lo que le da al conductor 45 segundos para buscar el texto (lo cual se espera)

2 segundos

 @driver.manage.timeouts.implicit_wait = 30 @wait = Selenium::WebDriver::Wait.new(:timeout => 5) # Time less than implicit @wait.until {@driver.find_element(:tag_name => "body").text.include?("hey")} 

Esto ahora le da al conductor 30 segundos para buscar el texto (no esperado)

¿Hay alguna manera de hacer que el selenium solo espere el tiempo de espera explicit y no el mayor de los dos?

Nota: No declarar el tiempo de espera implícito no es una opción, porque no puedo permitir que el selenium se cuelgue cada vez que el conductor no puede encontrar algo.

Usando Selenium versión 30, windows, ff

No mezcle esperas implícitas y explícitas. Parte del problema es que las esperas implícitas a menudo (¡pero pueden no ser siempre así!) Implementadas en el lado “remoto” del sistema WebDriver. Eso significa que están “integrados” en IEDriverServer.exe, chromedriver.exe, la extensión WebDriver Firefox que se instala en el perfil anónimo de Firefox, y el servidor remoto WebDriver de Java (selenium-server-standalone.jar). Las esperas explícitas se implementan exclusivamente en los enlaces de idiomas “locales”. Las cosas se vuelven mucho más complicadas cuando se utiliza RemoteWebDriver, ya que podría estar utilizando los lados local y remoto del sistema varias veces.

Así es como funcionaría: código local -> servidor remoto Java -> enlaces locales de lenguaje Java en el servidor remoto -> componente “remoto” como la extensión Firefox, chromedriver.exe o IEDriverServer.exe. Es aún más complejo en el caso de la cuadrícula, ya que podría haber otros saltos intermedios.

Por lo tanto, cuando intenta mezclar esperas implícitas y explícitas, se ha desviado hacia un “comportamiento indefinido”. Es posible que pueda averiguar cuáles son las reglas de ese comportamiento, pero estarán sujetas a cambios a medida que cambien los detalles de implementación de los controladores. Entonces no lo hagas

No debería experimentar “lockings” cuando no se puede encontrar un elemento si no está utilizando esperas implícitas. El controlador debe lanzar una excepción NoSuchElement inmediatamente.

La mejor práctica es establecer implicitlyWait () al comienzo de cada prueba, y usar WebDriverWait () para esperar un elemento, o un elemento AJAX para cargar.

Sin embargo, implicitlyWait () y WebDriverWait () no funcionan bien juntos en la misma prueba. Debería anular implicitlyWait () antes de llamar a WebDriverWait porque implicitlyWait () también establece el tiempo de espera “driver.findElement ()”.

Siempre que esté utilizando WebDriverWait () con implicitlyWait () ya haya establecido un valor inicial, siga los pasos –

  1. anulando implícitamente Espera ()
  2. Ejecutando WebDriverWait (), y elemento de retorno
  3. reiniciar implícitamente Esperar () nuevamente

Ejemplo de código Java –

 driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //nullify implicitlyWait() WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); element = wait.until(ExpectedConditions.visibilityOfElementLocated(by)); driver.manage().timeouts().implicitlyWait(DEFAULT_WAIT_4_PAGE, TimeUnit.SECONDS);