Captura de Telas Automática em Testes de Automação Web com Python

Em testes de automação web, a captura de telas quando um teste falha é essencial para diagnóstico. Aqui estão métodos para implemetnar essa funcionalidade usando farmeworks Python.

Utilizando o Framework unittest

No unittest, a captura pode ser feita diretamente no método tearDown, verificando se houve exceção durante o teste.

import sys
import unittest

class TesteAutomacao(unittest.TestCase):
    def tearDown(self):
        if sys.exc_info()[0]:
            nome_teste = self._testMethodName
            self.webdriver.save_screenshot(f"falhas/{nome_teste}.png")
        super().tearDown()

O atributo _testMethodName é específico do unittest. Para maior flexibilidade, pode-se sobrescrever o método run da classe de teste, utilizando uma classe auxiliar para gerar capturas com nomes baseados em timestamps.

import base64
import datetime

class AuxiliarCaptura:
    @staticmethod
    def capturar_tela(webdriver, nome_arquivo="erro.png"):
        if hasattr(webdriver, 'get_screenshot_as_base64'):
            dados_base64 = webdriver.get_screenshot_as_base64()
            dados_imagem = base64.b64decode(dados_base64)
            with open(nome_arquivo, "wb") as arquivo:
                arquivo.write(dados_imagem)
        else:
            webdriver.save_screenshot(nome_arquivo)

class TesteComCaptura(unittest.TestCase):
    def __init__(self, method_name='run_test', webdriver=None):
        super().__init__(method_name)
        self.webdriver = webdriver or self._obter_webdriver()

    def run(self, resultado=None):
        resultado = resultado or self.defaultTestResult()
        try:
            super().run(resultado)
        except Exception:
            formato = '%Y-%m-%d_%H.%M.%S_.png'
            nome_arquivo = datetime.datetime.now().strftime(formato)
            AuxiliarCaptura.capturar_tela(self.webdriver, nome_arquivo)
            raise

Usando o Framework nose

O nose é uma extensão do unittest. Para capturar telas em falhas, pode-se adaptar o método tearDown ou usar abordagens semelhantes, ajustando a obtenção do nome do teste.

import sys
import nose

class TesteNose(nose.tools.nosetester.NoseTester):
    def tearDown(self):
        if sys.exc_info()[0]:
            # Obtém o nome do teste atual dinamicamente
            teste_atual = nose.tools.nosetester.current_test_name()
            self.webdriver.save_screenshot(f"falhas/{teste_atual}.png")
        super().tearDown()

Alternativamente, pode-se modificar a execução dos testes no nose para integrar a captura de telas de forma mais granular, como interceptando eventos de falha.

Tags: Python Selenium unittest nose testes de automação

Publicado em 6-23 23:34