2012-10-02 17 views
6

Estoy trabajando en un sistema que tiene un frontend basado en web que estoy probando con Selenium. En una página, el contenido se carga dinámicamente cuando se desplaza hacia abajo (tal vez lo sepa de la lista de amigos de Facebook), porque es uno de los requisitos.Prueba de contenido cargado dinámicamente con Selenium Web Driver

Desplazar hacia abajo con Selenium Webdriver (uso Chrome) no debería ser un problema a través de Javascript. Pero hay un problema con el contenido agregado dinámicamente. ¿Cómo puedo hacer que Webdriver encuentre esos elementos?

He intentado lo siguiente para desplazarse hacia abajo hasta que no más contenido se carga:

int oldSize = 0; 
int newSize = 0; 
do { 
    driver.executeScript("window.scrollTo(0,document.body.scrollHeight)"); 
    newSize = driver.findElementsBy(By.cssSelector("selector").size(); 
} while(newSize > oldSize); 

Pero aunque la página se desplaza hacia abajo la primera vez y algunos ahora el contenido se haya cargado correctamente, no van a ser encontrados por los controladores función 'findElementsBy (By).

¿Alguien ha enfrentado este problema alguna vez? ¡Estaría muy contento si alguien pudiera ayudarme a encontrar una solución para eso!

Saludos, Benjamin

+0

voy a tener que desplazarse hacia abajo con el fin de cargar los elementos (a través de AJAX) Como dije, utilizo Chromedriver. –

Respuesta

0

Creo que el problema está esperando que el contenido dinámico se termine de cargar. Intenta esperar 3 segundos justo antes de findElementsBy? En C#, el código sería Thread.Sleep (3000);

+0

buena idea, probé ... findElements todavía entrega solo los elementos que se cargaron desde el principio en –

+0

@Benjamin: ¿Has probado un tiempo más largo como 5 segundos? ¿Podría verificar en SeleniumIDE que el selector CSS funciona cuando el elemento está presente?Haría una prueba en IDE, pero es complicado simular desplazamiento: puedes probar keyPress | xpath =/html/body/| 34 (código clave 34 es paginación), luego waitForElementPresent ... – pellucid

+0

de todos modos no funcionaré con SeleniumIDE ... –

4

Recomendaría usar WebDriverWait con ExpectedConditons.

//scroll down with Javascript first 
WebDriverWait wait = new WebDriverWait(driver, 30); 
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("selector"))); 
//interact with your element 
element.click() 

Tome un vistazo a la orientación proporcionada por la página oficial Selenio: http://seleniumhq.org/docs/04_webdriver_advanced.html

+0

+1. no es un mal enfoque, pero me parece mejor elegir fluidamente esperar por este caso. –

1

intento usando espera fluidez en particular. La característica principal es:

Una implementación de la interfaz Wait que puede tener su tiempo de espera y el intervalo de sondeo configurado sobre la marcha. Cada instancia de FluentWait define la cantidad máxima de tiempo para esperar una condición, así como la frecuencia con la que se verifica la condición. Además, el usuario puede configurar la espera para ignorar tipos específicos de excepciones mientras espera, como NoSuchElementExceptions cuando busca un elemento en la página.

public WebElement fluentWait(final By locator){ 
     Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
       .withTimeout(30, TimeUnit.SECONDS) 
       .pollingEvery(5, TimeUnit.SECONDS) 
       .ignoring(NoSuchElementException.class); 

     WebElement foo = wait.until(
new Function<WebDriver, WebElement>() { 
      public WebElement apply(WebDriver driver) { 
         return driver.findElement(locator); 
       } 
       } 
); 
          return foo;    }  ; 

el método descrito le devuelve elemento web se puede operar. Por lo tanto, el enfoque es el siguiente: 1) necesita encontrar los selectores de elementos que espera que se procesen después de desplazarse , p.

String cssSelector = "blablabla" 

2) debe desplazarse con js 3)

WebElement neededElement = fluentWait(cssSelector); 
neededElement.click(); 
//neededElement.getText().trim(); 

usted puede obtener más información acerca de espera fluidez here

+1

Tengo solo una pregunta: ¿cómo se hace una nueva función en Java, considerando que no hay plantillas de funciones? El ejemplo anterior también se menciona en selenium javadocs, pero javac me dará un símbolo de "no puedo encontrar": clase Función - Me gustaría entender qué parte me he perdido en el agarre para permitirme usar el enfoque anterior directamente desde el principio. – Vatsala

+0

podría aclararme un poco: ¿qué mencionas diciendo que la función de plantillas en Java? –

+1

No estoy seguro de qué quiere decir exactamente 'plantilla de funciones' pero la nueva función () {crea una instancia de clase anónima que se pasa a wait.until La función se define en la API de selnium. hasta (com.google.common.base.Function is True) Aplica repetidamente el valor de entrada de esta instancia a la función dada hasta que ocurra una de las siguientes situaciones: la función no devuelve ni nulo ni falso, la función arroja una excepción no ignorada, la el tiempo de espera expira, el hilo actual se interrumpe Cualquier problema de cumplimiento - parece que no ha configurado correctamente la configuración de IDE (en mi humilde opinión) –

Cuestiones relacionadas