2011-08-18 24 views
5

Estoy usando Selenium para probar una aplicación web que usa Dojo, y usa script java para mostrar ciertos elementos. Quiero esperar hasta que se muestren todos los elementos antes de intentar manipular la página, sin embargo, estoy teniendo problemas.¿Cómo contar los tiempos de espera de javascript activos?

He comenzado esperando que la variable dojo inFlight sea 0, esto indica que todo Ajax ha terminado. Esto no siempre funciona porque parece hacer algunas cosas en un tiempo de espera después.

También he intentado varias veces buscar el elemento, pero esto no es demasiado bueno, ya que tal vez haya algún javascript posterior que utilice este campo de alguna manera.

Así que, básicamente, quiero un método (al menos en firefox) para consultar el javascript esperando para ejecutar en un setTimeout (o setInterval) Incluso podría hacer frente a una forma de envolver la llamada incorporada a través de una función propia para hacer un seguimiento de esto.

¡Alguna idea o sugerencia apreciada!

Respuesta

5

Todas las funciones en JavaScript se pueden reemplazar. Considerar algo como esto:

window.originalSetTimeout = window.setTimeout; 

window.setTimeout = function(func, delay, params) { 
    window.timeoutCounter++; 
    window.originalSetTimeout(window.timeoutCallback, delay, [func, params]); 
} 

window.timeoutCallback = function(funcAndParams) { 
    window.timeoutCounter--; 
    func = funcAndParams[0]; 
    params = funcAndParams[1]; 
    func(params); 
} 

continuación:

selenium.waitForCondition("window.timeoutCounter == 0"); 
1

Siempre que llame al setTimeout de setInterval - se devuelve una identificación del temporizador.

  1. Guardar que Identificación del temporizador en una matriz
  2. Dentro de la función que está llamando en el tiempo de espera, pop que temporizador Identificación de la matriz. Porque tenemos que eliminar esa identificación de la matriz tan pronto como termine el temporizador.
  3. Cualquier momento que desee comprobar el no. de temporizadores activos, solo consulta la longitud de esa matriz.
+0

Hola, gracias por su respuesta. No estamos llamando a setTimeout o setInterval directamente. Están siendo llamados por la biblioteca Dojo, que es utilizada por nuestros desarrolladores de UI. Estamos intentando probar la aplicación con selenio, por lo que tenemos acceso para ejecutar javascript en la página, pero no podemos interferir fácilmente con la forma en que funciona el código que estamos probando. ¿Tal vez hay un complemento de Firefox que podría hacer un seguimiento de esto para nosotros y de alguna manera superponer el mecanismo de tiempo de espera incorporado? –

Cuestiones relacionadas