2009-08-11 9 views
12

Me gustaría un conjunto de pruebas web automatizadas basado en Selenium RC para tomar capturas de pantalla de páginas cuando se encuentran algunos errores. El conjunto de pruebas forma parte del proceso de integración continua y se ejecuta técnicamente mediante CruiseControl ejecutándose como un servicio de Windows.Selenium se ejecuta como un servicio de Windows para tomar capturas de pantalla en los errores

Se llama al método selenium.captureScreenshot() para activar la captura de pantalla real. He registrado un JUnit RunListener para llamarlo en cualquier falla de prueba.

El problema es que las capturas de pantalla son solo archivos en blanco - archivos PNG totalmente negros. Las dimensiones son 1440x900.

Al ejecutar manualmente las mismas pruebas desde Eclipse, las capturas de pantalla son correctas (aunque son capturas de pantalla de todo el escritorio, no de la ventana del navegador, pero esa es una historia diferente y un problema menor). Así que supongo que la causa del problema es que el Selenium se ejecuta como un servicio de Windows.

¿Cómo puedo tener las capturas de pantalla de las páginas tomadas cuando ocurren excepciones en las pruebas de Selenium?

El software utilizado:

  • Windows 2003 Server
  • selenio 1.0.1

Respuesta

5

Parece que hay una respuesta completamente diferente. El servicio de Windows (administrado por TanukiSoftware Java Service Wrapper) se inició con wrapper.ntservice.interactive establecido en false. Establecerlo en true ha ayudado. Finalmente, las capturas de pantalla contienen contenido de pantalla real.

Consulte el wrapper.ntservice.interactive para obtener más información.El análisis del código de contenedor conduce a [SERVICE_INTERACTIVE_PROCESS] (http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx) bandera se establece cuando se inicia el servicio Windows.

0

Aquí hay un código para la toma de fotografías utilizando el selenio y la clase del robot de Java:

public void takeAScreenShotOfTheApp() { 
    Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize(); 
    Rectangle screenBounds = new Rectangle(0, 0, screenDim.width, screenDim.height); 

    Robot robot = new Robot(); 
    BufferedImage image = robot.createScreenCapture(screenBounds); 

    File screenshotFile = new File("target" + File.separator 
           + "image" + System.currentTimeMillis() + ".png"); 
    ImageIO.write(image, "png", screenshotFile); 
} 

Se toma de este site

+0

Gracias. Voy a intentar esto. Pero dudo que pueda ayudar. He visto este sitio antes. Y en realidad la implementación de Selenium del comando 'captureScreenshot' parece usar exactamente la misma técnica: http://tinyurl.com/Selenium1260106 –

+0

@GrzegorzOledzki - Sospeché que el Selenio podría estar tomando el mismo enfoque. Por favor, háganos saber si funciona y buena suerte. – Steven

+0

Confirmado. El comportamiento es exactamente el mismo. El robot generó una imagen completamente en blanco (negro) con exactamente el mismo tamaño. Entonces, no hay progreso ... –

2

Al leer un poco más sobre esto, podría ser algo relacionado con el servicio de Windows que necesita permisos de seguridad adicionales. Volviendo a los servicios de Windows NT 3.5/4 tenía restricted access en el escritorio de la aplicación (requerido para capturas de pantalla) y supongo que sus restricciones de seguridad continúan hasta el día de hoy.

Este hilo acerca de services on the java.net forums puede proporcionar las pistas que necesita para hacerlo funcionar.

+0

El enlace java.net parece sugerir el uso de la conexión VNC a localhost. Lo veo como último recurso. Si se necesita una llamada remota, entonces nada debe impedir que llamemos al servidor de selenio en una máquina Linux con un soporte adecuado de Xserver. Pero eso complica mucho la infraestructura de construcción y espero que esto se pueda evitar. –

3

¿En qué navegador está ejecutando estas pruebas? Si es Firefox, recomendaría captureEntirePageScreenshot para capturar todo el lienzo, no solo lo que está a la vista (en lugar de la pantalla) y captureEntirePageScreenshotToString si está trabajando de forma remota y quiere guardar los archivos localmente.

No estoy seguro si esto ayudará con su problema, pero como usa un complemento para Firefox podría valer la pena intentarlo.

+0

Se usa Firefox. No estoy seguro de qué versión, tendría que verificarlo. De todos modos, gracias por el consejo, lo comprobaré. –

+0

Hm ... Estaba a punto de escribir que la sugerencia funcionó. Porque ha dado capturas de pantalla adecuadas una o dos veces. Pero algo se rompió de nuevo y ahora sigo recibiendo archivos en blanco de nuevo. Ahora las dimensiones difieren, a veces es 978x36 y algunas veces es 978x232 (dependiendo de la prueba real que se invoca), pero sigue siendo 100% PNG negro. Aaah. Pensé que estaba resuelto. –

+0

He visto un PNG negro una o dos veces, pero la mayoría de las veces funciona bien para mí. Aunque no estoy corriendo como un servicio ... Espero que encuentres algo que funcione. –

1

He tropezado con el problema con CaptureScreenshot generando imágenes en negro cuando se ejecuta bajo un servicio de Windows.

Usar CaptureEntirePageScreenshot como lo recomienda Dave Hunt funciona de manera constante para mí.

+0

Desafortunadamente. He visto capturas de pantalla no negras tomadas por captureEntirePageScreenshot() solo una vez. Justo después de cambiarlo (en lugar de captureScreenshot()). Pero desde entonces no funciona. –

0

No sé cómo el control de crucero ejecutará las pruebas de interfaz gráfica de usuario, pero recientemente he implementado un mecanismo de captura de pantalla mí y lo que aprendió fue que los componentes que está dibujando tienen que estar en una ventana o algún otro elemento raíz. elementos "sin raíces" serán simplemente no pintar adecuadamente y dar lugar a imágenes en blanco la mayoría de las veces.

Así que si el control de crucero o las pruebas de su unidad están usando algo de magia para no mostrar correctamente los elementos de la GUI, es posible que desee agregarlos a un JFrame ficticio antes de pintar.

-1

Una solución alternativa a su enfoque RunListener:

Incluya su prueba en un bloque try-catch y haga la captura de pantalla en el bloque catch, eso es lo que siempre hago.

Ejemplo de código java:

public void testEnterFormFields() 
    try { 
    enterFormFields(); 
    } catch(SeleniumException e) { 
    //do screenshot, logging, dumping, stacktracing or whatever here 
    } 
} 

Se podría atrapar Throwable o excepción, así, si sus reglas de codificación permiten, pero tiene sentido para detectar la excepción específica de uno en uno. Este enfoque produce un poco más de desorden en su código, pero le ayudará mucho en caso de análisis de fallas. Puede adaptar su manejo de excepciones al tipo de error. Es posible que desee capturar otras informaciones en caso de un AssertionError que en el caso de una SeleniumException.

+0

¿Cómo responde el problema de las capturas de pantalla en blanco? –

+0

De esta manera está tomando capturas de pantalla antes de salir del método de prueba -> antes de informar cualquier error y se invocan métodos de desmontaje que destruirán la instancia del navegador. –

Cuestiones relacionadas