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.