2011-06-23 11 views
5

Estoy tratando de realizar una tarea relativamente simple: esperar hasta que se complete una redirección de página. Acabo de ver another respondió la pregunta sobre el tema, donde un consejo es esperar a que aparezca un texto en particular en la última página (SI lo tengo bien). Si es así, ¿qué tal esperar hasta que window.location se modifique? ¿Es mejor? ¿Peor? Menos aplicable? ¿Alguna otra idea? solo curioso, si es necesario, puede marcar esta pregunta como una wiki de la comunidad.¿Cómo se espera la redirección de una página en Selenium?

Gracias!

Respuesta

1

Controlando el valor, devuelto driver.get_location me hizo el trabajo a la perfección. Aparentemente, por lo que he entendido en mis 5 minutos mirando el código fue que el valor window.location.href se monitorea bajo el capó.

+4

¿Podría elaborar un poco más sobre cómo controlar el valor? – emery

+0

¿Puedes por favor elaborarlo –

1

Sí, he encontrado este problema muchas veces cuando uso Selenium. Hay 2 formas en que trabajé alrededor de este problema. En primer lugar, puede cambiar el tiempo de espera implícito. Por ejemplo dado este pedazo de código:

Actions builder = new Actions(driver); 
builder.click(driver.findElement(By.className("lala"))).perform(); 

Este código será una excepción si en el punto que se llama no existen elementos que se pueden encontrar para que coincida con la clase "lala". Puede cambiar este tiempo de espera implícita con:

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 

Esto hace que la encuesta piloto durante 5 segundos en lugar de fallar de inmediato. Si el elemento aún no puede ser localizado después de 5 segundos, la acción fallará. Por supuesto, puedes cambiar esa configuración. Descubrí que este método funciona bien la mayoría de las veces. La mayoría de las veces no le importa la carga completa de la página, solo una parte determinada.

También escribí otra función que es GetElementByClassAndText que hacer lo mismo que espera implícita en un elemento excepto que también comprueba el texto que contiene además de permitir más fino detalle de lo que quiere:

public static void waitAndClick(WebDriver driver, By by, String text) { 
    WebDriverWait wait = new WebDriverWait(driver, 10000); 
    Function<WebDriver, Boolean> waitForElement = new waitForElement(by); 
    wait.until(waitForElement); 

    for(WebElement e : driver.findElements(by)) { 
     if(e.getText().equals(text)) { 
      Actions builder = new Actions(driver); 
      builder.click(e).perform(); 
      return; 
     } 
    } 
} 

Y el Función correspondiente que utiliza:

public class waitForElement implements Function<WebDriver, Boolean> { 
    private final By by; 
    private String text = null; 

    public waitForElement(By by) { 
     this.by = by; 
    } 

    public waitForElement(By by, String text) { 
     this.by = by; 
     this.text = text; 
    } 

    @Override 
    public Boolean apply(WebDriver from) { 
     if(this.text != null) { 
      for(WebElement e : from.findElements(this.by)) { 
       if(e.getText().equals(this.text)) { 
        return Boolean.TRUE; 
       } 
      } 

      return Boolean.FALSE; 
     } else { 
      try { 
       from.findElement(this.by); 
      } catch(Exception e) { 
       return Boolean.FALSE; 
      } 

      return Boolean.TRUE; 
     } 
    } 
} 

me doy cuenta de que está utilizando selenio en Ruby, pero espero que algunos de mi código (al menos conceptualmente) es transferible y útil para usted.

+0

No estoy muy seguro de que esto responda a la pregunta: ¿es posible simplemente verificar un cambio en window.location en lugar de utilizar el tipo de estrategia que implementa su código? – emery

-3

Puede usar esta función, volverá a cargar la página actual (después de haber sido redirigida): driver.getCurrentUrl();

Cuestiones relacionadas