Pregunta ¿Cómo se obtiene el selenio para reconocer que se cargó una página?


En ciertas situaciones desconocidas, el selenio no detecta que una página se haya cargado al usar el método abierto. Estoy usando la API de Java. Por ejemplo (Este código no producirá este error. No sé de una página visible externamente que lo haga):

Selenium browser = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com");
browser.start();
browser.open("http://www.google.com/webhp?hl=en");
browser.type("q", "hello world");

Cuando se produce el error, la llamada a "abrir" expira, aunque se puede ver claramente que la página se ha cargado correctamente antes de que se agote el tiempo de espera. Aumentar el tiempo de espera no ayuda. La llamada a 'tipo' nunca ocurre, no se realiza ningún progreso.

¿Cómo se obtiene el selenio para reconocer que la página se ha cargado cuando se produce este error?


9
2017-09-17 22:18


origen


Respuestas:


Me enfrenté a este problema bastante recientemente.

Todas las soluciones basadas en JS no se ajustaban bien a la combinación ICEFaces 2.x + Selenium 2.x / Webdriver que tengo.

Lo que hice y lo que funcionó para mí es lo siguiente:

En la esquina de la pantalla, hay un indicador de actividad de conexión.

            <ice:outputConnectionStatus id="connectStat"
                                        showPopupOnDisconnect="true"/>

En mi prueba de unidad de Java, espero hasta que su imagen 'inactiva' vuelva a aparecer:

private void waitForAjax() throws InterruptedException {
    for (int second = 0;; second++) {
        if (second >= 60) fail("timeout");
        try { 
            if ("visibility: visible;".equals(
                selenium.getAttribute("top_right_form:connectStat:connection-idle@style"))) { 
                break;
            }
        } catch (Exception e) {

        }
        Thread.sleep(1000);
    }
}

Puede deshabilitar la representación de este indicador en producción, si no es necesario mostrarlo en la página o usar gifs vacíos de 1x1 como sus imágenes.

Funciona al 100% (con ventanas emergentes, mensajes enviados, etc.) y lo alivia de la necesidad de especificar waitForElement (...) para cada elemento por separado.

Espero que esto ayude a alguien.


2
2017-11-10 11:54



Quizás esto te ayude ...

Considera que el siguiente método está en la página llamada Functions.java

public static void waitForPageLoaded(WebDriver driver) {

         ExpectedCondition<Boolean> expectation = new
    ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver driver) {
              return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
            }
          };

          WebDriverWait wait = new WebDriverWait(driver,30);
          try {
                  wait.until(expectation);
          } catch(Throwable error) {
                  Assert.assertFalse(true, "Timeout waiting for Page Load Request to complete.");
          }
     } 

Y puedes llamar a este método en tu función. Como es un método estático, puede llamar directamente con el nombre de la clase.

public class Test(){
    WebDriver driver;

    @Test
    public void testing(){
         driver = new FirefoxDriver();
         driver.get("http://www.gmail.com");
         Functions.waitForPageLoaded(driver);
   }
}

2
2017-08-08 03:21



Cuando realizo las pruebas de Selenium, espero ver si un determinado elemento es visible (waitForVisible), luego realizo mi acción. Normalmente trato de usar un elemento después del que estoy escribiendo.


1
2017-09-17 22:25



Usar 'openAndWait' en lugar de 'abrir' hará el truco.

Desde el sitio web:

Se pueden invocar muchas acciones con el sufijo "AndWait", p. Ej. "clickAndWait". Este sufijo le dice a Selenium que la acción hará que el navegador haga una llamada al servidor, y que Selenium debería esperar a que se cargue una nueva página.


1
2017-09-18 19:44



Habilitar la función 'multiWindow' resolvió el problema, aunque no tengo claro por qué.

SeleniumServer (int port, boolean slowResources, boolean multiWindow)

SeleniumServer server = new SeleniumServer(4444, false, true);

Cualquier aclaración sería útil.


0
2017-09-17 22:25



Me he encontrado con problemas similares cuando uso Selenium para probar una aplicación con iFrames. Básicamente, parecía que una vez que se cargaba la página principal (la página que contenía los iframes), Selenium no podía determinar cuándo el contenido del iframe había terminado de cargarse.

Al mirar la fuente del enlace que está intentando cargar, parece que hay algo de Javascript que crea elementos de página adicionales una vez que la página se ha cargado. No puedo estar seguro, pero es posible que esto sea lo que está causando el problema, ya que parece similar a la situación que he encontrado anteriormente.

¿Obtiene el mismo tipo de errores al cargar una página estática? (es decir, algo con html directo)

Si no puedes obtener una mejor respuesta, prueba los foros de selenio, por lo general, son bastante activos y los desarrolladores de Selenium responden a buenas preguntas.

http://clearspace.openqa.org/community/selenium_remote_control

Además, si aún no lo ha intentado, agregue una llamada al navegador. Espere por Página ("15000") después de la llamada para abrir. He descubierto que hacer esto después de cada transición de página hace que mis pruebas sean un poco más sólidas, aunque técnicamente no es necesario. (Cuando Selenium detecta que la página en realidad se ha cargado, continúa, por lo que la variable de tiempo de espera real no es realmente una preocupación).


0
2017-09-18 12:41



No es una solución perfecta, pero estoy usando este método

$t1 = time(); // current timestamp
$this->selenium->waitForPageToLoad(30);
$t2 = time();

if ($t2 - $t1 >= 28) {
    // page was not loaded
}

Entonces, está comprobando si la página no se cargó durante el tiempo especificado, por lo que no está cargada.


0
2018-04-21 09:22



otra idea es modificar la API de AJAX (para agregar texto después de las acciones de AJAX). Después de que la acción ajax haya terminado, antes de regresar, establezca el campo invisible en VERDADERO, el selenio lo encontrará y lo leerá como luz verde

en html:

<input type='hidden' id="greenlight">

en selenio

if(driver.findElement(By.id("greenlight")).getAttr("value").equals("TRUE")){
    // do something after page loading
}

0
2017-09-18 11:22



Si su página no tiene AJAX, intente buscar el pie de página (también uso Junit fail(""), puedes utilizar System.err.println() en lugar):

    element.click();
    int timeout =120; 
    // one loop = 0.5 sec, co it will be one minute 
    WebElement myFooter = null;

    for(int i=0; i<timeout; i++){
      myFooter = driver.findElement(By.id("footer"));
      if(myFooter!= null){
        break;
      }
      else{
        timeout--;
      }
}
if(timeout==0 && myFooter == null){
  fail("ERROR! PAGE TIMEOUT");
}

0
2017-09-18 11:15