2011-04-08 22 views
9

Sé que puedo obtener el controlador de Selenium 2 para ejecutar JavaScript y obtener los valores de retorno, pero están ocurriendo tantas cosas asincrónicas. Me gustaría que JavaScript hablara con Selenium en lugar de hacerlo al revés. He hecho algunas búsquedas y no he encontrado nada como esto. ¿Las personas generalmente usan implicitly_wait? ¿Eso parece fallar ya que no es posible cronometrar todo? El ejemplo perfecto sería dejar que Selenium sepa cuándo se completó un XHR o una animación asíncrona con tiempo de ejecución indeterminado.¿Puede JavaScript hablar con Selenium 2?

¿Esto es posible? Estamos usando Selenium 2 con Python en Saucelabs.

Respuesta

8

Usted debe mirar en el método execute_async_script() (JavascriptExecutor.executeAsyncScript en Java, IJavaScriptExecutor.ExecuteAsyncScript() en .NET), que le permite esperar a una función de devolución de llamada. La función de devolución de llamada se agrega automáticamente a la matriz arguments en su función de JavaScript. Así, suponiendo que tiene una función de JavaScript que ya están en la página que espera hasta que la condición que desea, se puede hacer algo como lo siguiente (código Java a continuación, C# y el código Python deben ser similares):

String script = "var callback = arguments[arguments.length - 1];" 
    + "callback(myJavaScriptFunctionThatWaitsUntilReady());"; 

driver.manage().timeouts().setScriptTimeout(15, TimeUnit.SECONDS); 
((JavascriptExecutor)driver).executeAsyncScript(script); 

Se podría ser posible ser aún más inteligente y pasar la función de devolución de llamada directamente a un evento que devuelve los datos adecuados. Puede encontrar más información sobre la función executeAsyncScript() en el proyecto JavaDocs, y puede encontrar un código de muestra para esto en el árbol fuente del proyecto. Hay un gran ejemplo de esperar que se complete un XHR en las pruebas en this file.

Si esto aún no está disponible en la versión de los enlaces de Python disponibles para usar con SauceLabs, esperaría que estuviera disponible en poco tiempo. Es cierto que, en cierto sentido, esto está impulsando la "encuesta del estado deseado" desde su caso de prueba a JavaScript, pero haría que su prueba sea más legible.

+1

Estos son excelentes consejos, gracias. –

2

no ser demasiado contundente, pero si usted quiere que su aplicación para hablar con su corredor de prueba, entonces estás haciendo mal.

Si necesita esperar a que termine un XHR, puede intentar mostrar un girador y luego probar que el ruteador ha desaparecido para indicar que se realizó con éxito.

Con respecto a la animación, cuando la animación se haya completado, tal vez su devolución de llamada podría agregar una clase que indique que la animación ha finalizado y luego podría probar la existencia de esa clase.

+1

En ambos casos está ignorando la parte de temporización. JavaScript es asincrónico. No estoy preguntando cómo hacer que Selenium controle las cosas, estoy preguntando cómo saber cuándo verificarlo. Una pregunta que no has respondido. Como JavaScript es asíncrono, el mejor momento es cuando JavaScript está listo y solo JavaScript sabe cuándo. Un gancho es la mejor manera de hacerlo. Entonces, ¿hay alguno? –

+2

En mi experiencia con Selenium 1 y 2, su prueba desencadena una llamada asincrónica en su aplicación. Luego usa un comando wait_for para esperar a que exista un elemento (o no existe). Si escribe su aplicación para esperar que exista Selenium, entonces creo que está abordando el problema incorrectamente. Su aplicación no debería preocuparse por Selenium, o cualquier otro marco de prueba para ese asunto. Eso le permite intercambiar corredores de prueba en el futuro si sale algo mejor. –

+2

Quizás esta sea una respuesta mejor: le dice a Selenium que verifique inmediatamente después de desencadenar una acción asincrónica. El selenio esperará durante un período de tiempo para que exista esa condición. Si no existe dentro del tiempo asignado, entonces se supone que la acción falló, por lo que la prueba debería fallar. –

3

Teóricamente es posible, pero recomendaría que no lo haga.

La solución sería, probablemente, tener un poco de jQuery que se ejecuta en el sitio que establece una variable a cierto cuando el procesamiento de JavaScript ha terminado.

Conjunto selenio hasta bucle a través de un getEval hasta que esta variable se convierte en realidad y luego hacer algo en selenio.

Sería satisfacer sus requisitos, pero es una idea muy mala. Si por alguna razón su jQuery no establece la variable de activación en verdadero (o en el estado que espere), el selenio se quedará ahí indefinidamente. Podrías poner un largo tiempo de espera en ello, pero ¿cuál sería la diferencia al obtener Selenium para hacer un getEval y esperar a que aparezca un elemento específico?

Parece que está tratando de sobreinyectar su solución y le causará más dolor en el futuro con muy pocos beneficios adicionales.

+1

Estás sugiriendo que se vuelen con selenio, que no es lo mismo. Me preguntaba si Selenium tenía ganchos que escuchó que se agregaron al sitio. Estoy sorprendido de que no. Incluso Flash tiene esto en flash externo. –

+1

Selenium no modifica el sitio, solo mira el DOM y el HTML. La única forma en que puede hacer lo que quiere hacer es manipulando el DOM de alguna manera y luego obteniendo Selenium para verificar el DOM para su cambio. No puedes conducir el selenio desde tu sitio web. – Ardesco

+1

No puede conducir el selenio desde su sitio web. Esa es mi respuesta entonces. Debería hacer esto en mi opinión, pero no lo hace. ¡Gracias! –

1

animación de pruebas con el selenio está abriendo una lata de gusanos.Las pruebas pueden ser bastante frágiles y causar muchos falsos positivos.

El problema es hacer que las llamadas sean asincrónicas, y que sea difícil seguir el comportamiento y cambiar el estado de la página.

En mi experiencia, la llamada asíncrona puede ser tan rápida que la ruleta nunca se muestra, y el estado de la página puede omitir un estado completo (que Selenium puede detectar).

Esperar el estado de la página para la transición puede hacer que las pruebas sean menos frágiles, sin embargo, los falsos positivos no se pueden eliminar por completo.

Recomiendo pruebas manuales para la animación.

Cuestiones relacionadas