Estamos utilizando Selenium para automatizar nuestras UIpruebas. Recientemente hemos visto a la mayoría de nuestros usuarios usando Chrome. Así que queríamos saber: ventajas y desventajas de usar PhantomJS vs Selenium:
¿Existe alguna ventaja real en términos de rendimiento, por ejemplo, el tiempo necesario para ejecutar los casos de prueba?
¿Cuándo se debe preferir PhantomJS sobre Selenium?
Están atacando diferentes problemas. Dado que PhantomJS se ejecuta perfectamente en la línea de comandos, es adecuado como la primera capa de prueba de humo, ya sea como parte del flujo de trabajo de desarrollo y / o en un servidor de integración continua. Selenium se dirige a múltiples navegadores y, por lo tanto, es muy útil para garantizar la coherencia entre navegadores y realizar pruebas exhaustivas en diferentes sistemas operativos.
Si su aplicación web necesita ejecutarse en una variedad de navegadores web, ejecutar la prueba de IU solo con PhantomJS no producirá la mayor cobertura de prueba. Sin embargo, está perfectamente bien lanzar PhantomJS y realizar algunas comprobaciones básicas de cordura antes de realizar las pruebas en profundidad. ¡Imagina la locura de probar una aplicación de finanzas donde la pantalla de inicio de sesión se rompe involuntariamente y no funciona!
Tenga en cuenta que la línea entre los dos se vuelve ligeramente borrosa con el reciente soporte de WebDriver en el último PhantomJS. Ahora es posible ejecutar rápidamente las pruebas primero usando PhantomJS y luego (suponiendo que no se encuentre un error grave) continuar ejecutando las mismas pruebas a fondo en una configuración de Selenium.
Gracias por la respuesta. Cualquier enlace que pueda ayudarme a comprender cómo las personas usan phantomjs para recopilar estadísticas relacionadas con el rendimiento en una aplicación de producción del mundo real.
spirit3189
34
Ariya Hidayat parece ser el creador de PhantomJs
Sebastian Patten
Parece que su flujo de trabajo descrito de comenzar a escribir pruebas con PhantomJS y luego usar Selenium supone una reescritura total de las pruebas ... ¿Podría usar scripts PhantomJS directamente con Selenium?
lajarre
1
¡Gracias por el fantástico PhantomJS, @AriyaHidayat! :)
rinogo
49
Con la reciente integración de WebDriver (como ha señalado Ariya), ahora puede usar Selenium para conducir PhantomJS.
Esto es inmensamente poderoso.
Puede ejecutar un conjunto de pruebas Selenium completamente automatizadas (utilizando PhantomJS como la implementación de WebDriver) a través de su CI en un servidor Unix sin cabeza en cada registro. Luego, si desea probar la compatibilidad del navegador, puede ejecutar sus pruebas localmente cambiando la implementación subyacente de WebDriver a Chrome, Firefox, etc.
Actualmente estoy escribiendo un marco de extracción web. Tengo 524 pruebas que obtienen datos de 250 sitios web usando XPath. Inicialmente, el marco utilizaba un analizador HTML, HTMLCleaner, pero actualmente estoy investigando el uso de Selenium porque quiero soporte para Javascript. He ejecutado las pruebas contra los controladores HtmlUnit, Chrome, Firefox y PhantomJS . Aquí hay una comparación del tiempo necesario y el número de fallas para cada enfoque:
Failures Time (secs)
HtmlCleaner 0 82
HtmlUnit 169 102
Google Chrome 38 562
Firefox 46 1159
PhantomJS 40 575
Algunos comentarios:
En algunos casos, las "fallas" pueden no ser fallas en absoluto, puede ser que los extractores estén fallando porque Javascript está reescribiendo el DOM. Estoy en el proceso de analizar las fallas para encontrar la causa.
Dicho esto, HtmlUnit es el controlador Selenium más rápido, pero tampoco es confiable. Esta falta de fiabilidad no solo concierne a Javascript, hay problemas al procesar HTML "desordenado, sucio y del mundo real" porque algo parece estar roto en el algoritmo de equilibrio de etiquetas. Se han planteado un par de problemas al respecto, pero no se han solucionado; consulte HTML-UNIT 1423 y HTML-UNIT 1046 .
Firefox es el controlador Selenium más lento, aunque estoy desactivando la carga de imágenes y las hojas de estilo. Esto se debe a que es el más lento para cargar e inicializar, lo que lo hace considerablemente más lento que Chrome, y cada vez que falla una extracción, necesito volver a cargar el controlador (en las pruebas creo un grupo de 5 controladores para mitigar los retrasos de recuperación de URL para todos los controladores web Selenium).
PhantomJS logra una mejor precisión que Firefox, ligeramente más bajo que Chrome, pero en aproximadamente la mitad del tiempo que Firefox. Lo que es más, puedo ejecutarlo en mi caja de desarrollo, no "se hace cargo de mi máquina" mediante el lanzamiento de varios navegadores para que pueda seguir trabajando.
¿Se tarda 9 minutos en ejecutar su conjunto de pruebas con phantomJS? Eso debe sentirse como siempre ...
Kevin
@Kevin Sí :), pero HTMLCleaner es la prueba estándar, marco usar las categorías JUnit para marcar las otras pruebas como opcionales para que no formen parte de las pruebas unitarias estándar
Mark Butler
Gracias. Sí, he estado trabajando en pruebas completas de js y son tan glaciales, como 15-20 segundos para una prueba de algunas páginas. Quizás mi escala de 'glacial' deba ajustarse aunque jeje :) Aunque sea extraño, si lo hago manualmente, solo toma ~ 5 segundos hacer clic en los formularios.
Kevin
1
@lucaswxp ¡Sí! Y muchos otros proyectos en el medio. Como explico anteriormente, no hay una elección perfecta. En ese momento, usé HtmlCleaner, pero agregué una opción para usar PhantomJS, si la página que se extraería lo necesitaba.
Mark Butler
1
@iconoclast No, desafortunadamente, el empleador anterior tiene la IP.
Mark Butler
2
Aprovechando el poder de Selenium y PhantomJS
PhantomJS tiene las capacidades de navegador sin cabeza, por lo tanto, es bueno usarlo como uno de los navegadores con selenio (además de los navegadores tradicionales como IE, Chrome, etc.) Ventajas de este enfoque:
Se puede usar para ejecutar Sanity para aplicaciones web en CI (aunque las máquinas del agente no tienen IE o Chrome), las pruebas se ejecutarán de manera efectiva.
Algunos equipos de desarrollo utilizan este enfoque para obtener resultados rápidos y consumen menos tiempo y recursos.
La mayor característica de phantom JS es la captura de pantalla, que ejecuta pruebas paralelas utilizando múltiples subprocesos, lo que reducirá enormemente el tiempo de ejecución.
En algún momento, los localizadores que funcionaban bien en el navegador Chrome no funcionan en phantomJS.
A veces, mientras hago doble clic o clic contextual por selenio, tengo que poner un control adicional para verificar las operaciones porque en primer lugar no está haciendo clic.
Caché y cookies de persistencia. Después de cerrar sesión y luego iniciar sesión, los datos permanecen en caché. El | Entonces realizamos la prueba en Chrome.
Uno de los problemas más importantes que encontré "Problema de carga de archivos". No podemos cargar un archivo en el navegador phantomJs en nuestra aplicación. Intentamos muchas cosas javascriptexcutor, jqueries pero ninguno de ellos funcionó en absoluto. Entonces también realizamos esta prueba en Chrome. Nota: Utilizamos funciones de JavaScript ampliamente en nuestro marco para interactuar con el elemento web para PhantomJS. Una cosa es segura: el tiempo de ejecución es muy inferior en PhantomJS. Por lo tanto, depende de la prioridad del cliente si quiere Funcionalidad / Rendimiento y luego ir con él. Si desea probar el escenario de extremo a extremo, vaya a Chrome.
Con la reciente integración de WebDriver (como ha señalado Ariya), ahora puede usar Selenium para conducir PhantomJS.
Esto es inmensamente poderoso.
Puede ejecutar un conjunto de pruebas Selenium completamente automatizadas (utilizando PhantomJS como la implementación de WebDriver) a través de su CI en un servidor Unix sin cabeza en cada registro. Luego, si desea probar la compatibilidad del navegador, puede ejecutar sus pruebas localmente cambiando la implementación subyacente de WebDriver a Chrome, Firefox, etc.
fuente
Actualmente estoy escribiendo un marco de extracción web. Tengo 524 pruebas que obtienen datos de 250 sitios web usando XPath. Inicialmente, el marco utilizaba un analizador HTML, HTMLCleaner, pero actualmente estoy investigando el uso de Selenium porque quiero soporte para Javascript. He ejecutado las pruebas contra los controladores HtmlUnit, Chrome, Firefox y PhantomJS . Aquí hay una comparación del tiempo necesario y el número de fallas para cada enfoque:
Algunos comentarios:
En algunos casos, las "fallas" pueden no ser fallas en absoluto, puede ser que los extractores estén fallando porque Javascript está reescribiendo el DOM. Estoy en el proceso de analizar las fallas para encontrar la causa.
Dicho esto, HtmlUnit es el controlador Selenium más rápido, pero tampoco es confiable. Esta falta de fiabilidad no solo concierne a Javascript, hay problemas al procesar HTML "desordenado, sucio y del mundo real" porque algo parece estar roto en el algoritmo de equilibrio de etiquetas. Se han planteado un par de problemas al respecto, pero no se han solucionado; consulte HTML-UNIT 1423 y HTML-UNIT 1046 .
Firefox es el controlador Selenium más lento, aunque estoy desactivando la carga de imágenes y las hojas de estilo. Esto se debe a que es el más lento para cargar e inicializar, lo que lo hace considerablemente más lento que Chrome, y cada vez que falla una extracción, necesito volver a cargar el controlador (en las pruebas creo un grupo de 5 controladores para mitigar los retrasos de recuperación de URL para todos los controladores web Selenium).
PhantomJS logra una mejor precisión que Firefox, ligeramente más bajo que Chrome, pero en aproximadamente la mitad del tiempo que Firefox. Lo que es más, puedo ejecutarlo en mi caja de desarrollo, no "se hace cargo de mi máquina" mediante el lanzamiento de varios navegadores para que pueda seguir trabajando.
Recomiendo encarecidamente PhantomJS.
fuente
Aprovechando el poder de Selenium y PhantomJS PhantomJS tiene las capacidades de navegador sin cabeza, por lo tanto, es bueno usarlo como uno de los navegadores con selenio (además de los navegadores tradicionales como IE, Chrome, etc.) Ventajas de este enfoque:
fuente
desafíos que enfrenté mientras usaba PhantomJS:
Mi aplicación estaba valorando la aplicación web:
fuente