Integración de capturas de pantalla en Allure Report con Pytest y Selenium
El proceso de interpretación de los resultados de las pruebas debe estar optimizado para velocidad y claridad. Idealmente, la causa raíz de un fallo debería ser identificable de inmediato sin que el lector tenga que inspeccionar código adicional, ejecutar un depurador o pedir ayuda a otros miembros del equipo.
Para lograr este objetivo, los informes de prueba deben transmitir información completa en un formato conciso. Un enfoque efectivo es la inclusión de capturas de pantalla, que proporcionan contexto visual para los fallos de prueba. Esta guía describe el proceso de capturar capturas de pantalla usando el complemento pytest-selenium e integrarlas en los informes de prueba con Allure Report para mejorar la legibilidad y el análisis.
1. Preparación
Requisitos previos
Asegúrate de cumplir con los siguientes requisitos previos:
Lista de dependencias
Esta guía utiliza los siguientes paquetes:
Código de ejemplo
El código fuente completo utilizado en esta guía está disponible en https://github.com/allure-examples/guide-pytest-selenium-screenshots.
Configuración
Para ejecutar los ejemplos de esta guía:
- Instala Python
- Instala Allure Report
- Descarga un proyecto nuevo con Pytest desde Allure Start
- Agrega el complemento pytest-selenium a tu proyecto. Por ejemplo, si usas
pip
:
pip install pytest-selenium
2. Capturas de pantalla con Selenium
Para tomar capturas de pantalla con pytest-selenium en cualquier momento, usa los métodos proporcionados por el objeto WebDriver
, por ejemplo, save_screenshot
. Para obtener el objeto WebDriver
, puedes usar el fixture selenium
:
def test_example(selenium):
selenium.get("https://www.selenium.dev/")
try:
assert "Selenium" in selenium.title
except AssertionError:
selenium.save_screenshot("path/to/screenshot.png")
raise
Siempre que llames al método save_screenshot
, una captura de pantalla aparecerá en path/to/screenshot.png
. También puedes usar otros métodos que proporciona el objeto WebDriver
:
Para tomar una captura de pantalla de un elemento en particular, usa el método screenshot
del objeto WebElement
, por ejemplo:
element = selenium.find_element(By.NAME, "q") # o como sea que encuentres el elemento
# tomar la captura de pantalla
element.screenshot("path/to/element_screenshot.png")
También puedes usar estas propiedades de WebElement
:
3. Capturas de pantalla automáticas en caso de fallo
Para tomar capturas de pantalla automáticamente en cada fallo de prueba:
Escribe un hook que pytest-selenium llamará para procesar las capturas de pantalla que toma. El código del hook debe colocarse en el archivo
conftest.py
en el directorio raíz de pruebas de tu proyecto:python# Contenido de conftest.py import base64 def pytest_selenium_capture_debug(item, report, extra): for log_type in extra: if log_type["name"] == "Screenshot": content = base64.b64decode(log_type["content"].encode("utf-8")) with open(f"{item.name}.png", "wb") as f: f.write(content)
Establece la opción
selenium_capture_debug
afailure
en la configuración de Pytest. Por ejemplo, si usaspyproject.toml
como archivo de configuración, agrega lo siguiente:toml[tool.pytest.ini_options] ... selenium_capture_debug = "failure"
Ahora, cuando una prueba falle, se guardará automáticamente un archivo de captura de pantalla en tu proyecto.
4. Integración con Allure Report
Si bien capturar capturas de pantalla es beneficioso para diagnosticar fallos en las pruebas, verlas por separado puede ser ineficiente. Cuando los datos de la prueba están dispersos en varias ubicaciones, el proceso de identificar y resolver fallos se vuelve más lento.
Para agilizar este flujo de trabajo, las capturas de pantalla deben adjuntarse directamente a los informes de Allure, asegurando que toda la información relevante de la prueba esté consolidada en un solo lugar para un análisis y resolución de problemas más eficiente.
Allure Report te muestra las capturas de pantalla dentro de la prueba en la que fueron tomadas. Allí también se presentan los mensajes de error y otros archivos adjuntos, por lo que tienes todo lo que necesitas para analizar los resultados de la prueba en un solo lugar:
Para adjuntar capturas de pantalla a Allure, usa ya sea la función allure.attach()
o la función allure.attach.file()
.
Usa allure.attach.file()
para adjuntar un archivo existente:
import allure
from pathlib import Path
# Adjuntar una captura de pantalla de una página
def attach_screenshot(driver, path):
name = Path(path).name
driver.get_screenshot_as_file(path)
allure.attach.file(
path,
name=name,
attachment_type=allure.attachment_type.PNG,
)
# Adjuntar una captura de pantalla de elemento
def attach_element_screenshot(element, path):
name = Path(path).name
element.screenshot(path)
allure.attach.file(
path,
name=name,
attachment_type=allure.attachment_type.PNG,
)
Usa allure.attach()
si no necesitas guardar la captura de pantalla en disco:
import allure
# Adjuntar una captura de pantalla de una página
def attach_screenshot(driver, name):
allure.attach(
driver.get_screenshot_as_png(),
name=name,
attachment_type=allure.attachment_type.PNG,
)
# Adjuntar una captura de pantalla de elemento
def attach_element_screenshot(element, name):
allure.attach(
element.get_screenshot_as_png(),
name=name,
attachment_type=allure.attachment_type.PNG,
)
TIP
Cuando necesites adjuntar una captura de pantalla recién tomada, es preferible usar la función allure.attach
si es posible. La razón es que cuando guardas una captura de pantalla en el disco, es posible que no esté disponible de inmediato para su lectura debido al almacenamiento en caché del sistema operativo. Si eso sucede, podrías terminar con un archivo vacío adjunto en Allure.
Para adjuntar automáticamente las capturas de pantalla a Allure en cada fallo de prueba, usa una versión ligeramente modificada del hook de pytest-selenium que hemos escrito en la sección Capturas de pantalla automáticas en caso de fallo:
# Contenido de conftest.py
import allure
import base64
from allure_commons.types import AttachmentType
def pytest_selenium_capture_debug(item, report, extra):
for log_type in extra:
if log_type["name"] == "Screenshot":
content = base64.b64decode(log_type["content"].encode("utf-8"))
allure.attach(
content,
name="Screenshot on failure",
attachment_type=AttachmentType.PNG,
)
5. Otros tipos de adjuntos
Allure Report también puede manejar otros tipos de adjuntos, como texto, tablas, listas de URI o documentos (XML, JSON, YAML). Por ejemplo:
allure.attach(
response_content,
name="response content",
attachment_type=allure.attachment_type.XML
)
Allure Pytest adjunta algunos elementos automáticamente:
- Todo lo enviado a
sys.stdout
, por ejemplo,print(...)
- Todo lo enviado a
sys.stderr
, por ejemplo,print(..., file=sys.stderr)
- Registros de logging, por ejemplo,
logging.warning(...)
Estos resultados se adjuntan al informe como pseudoarchivos:
Si no deseas que todo esto aparezca en el informe, usa la opción --allure-no-capture
.
Allure también te permite adjuntar videos. Puedes consultar la documentación oficial para obtener más información sobre adjuntos con Pytest y tipos de adjuntos.
6. Conclusión
Al usar Pytest con Selenium, puedes tomar capturas de pantalla en momentos arbitrarios durante tus pruebas o instruir a Selenium para que tome capturas de pantalla automáticamente en caso de fallos en las pruebas. Allure Report permite ver las capturas de pantalla y otros archivos adjuntos de las pruebas (texto, documentos, tablas, videos) en un solo lugar, proporcionando al lector la mayor cantidad de datos para resolver los fallos de las pruebas.