Em testes automatizados com Appium e Python, dividir o código em classes distintas melhora a manutenção. No entanto, cada classe pode inicializar o driver, reiniciando o aplicativo a cada execução, o que é ineficiente. Utilizar o padrão singleton através do método __new__ permite reutilizar a instância do driver entre diferentes classes.
Implemente a solução com uma classe que gerencia o driver:
# gerenciador_driver.py
# Configuração do driver usando singleton
from appium import webdriver
from config.parametros_globais import nome_pacote_aplicativo, nome_dispositivo
class GerenciadorDriver(object):
def __new__(cls, *args, **kwargs):
"""
Aplica o padrão singleton para garantir uma única instância do driver.
Assim, objetos de outras classes compartilham a mesma sessão do Appium.
"""
if not hasattr(cls, '_instancia'):
capacidades = {}
capacidades['platformName'] = 'Android'
capacidades['platformVersion'] = '8.1.0'
capacidades['appPackage'] = nome_pacote_aplicativo
capacidades['appActivity'] = '.atividade_principal'
capacidades['unicodeKeyboard'] = 'true'
capacidades['resetKeyboard'] = 'true'
capacidades['newCommandTimeout'] = '180'
capacidades['deviceName'] = nome_dispositivo
capacidades['noReset'] = True
instancia_base = super(GerenciadorDriver, cls)
cls._instancia = instancia_base.__new__(cls)
cls._instancia.driver = webdriver.Remote(
"http://localhost:4723/wd/hub", capacidades
)
return cls._instancia
class ClienteDriver(GerenciadorDriver):
def obter_driver(self):
return self.driver
Para utiilzar em outros arquivos, crie uma instância única do cliente:
# teste_sistema.py
import unittest
import time
import warnings
from src.paginas import pagina_login
from src.comum import gerenciador_driver, operador_gestos
from config.parametros_globais import nome_usuario_login, senha_login
class TesteLogin(unittest.TestCase):
@classmethod
def setUpClass(cls):
warnings.simplefilter("ignore", ResourceWarning)
cls.driver = gerenciador_driver.ClienteDriver().obter_driver()
cls.operador_gestos = operador_gestos.ManipuladorGestos()
def testar_login(self):
pagina = pagina_login.PaginaLogin(self.driver)
pagina.inserir_usuario(nome_usuario_login)
pagina.inserir_senha(senha_login)
pagina.clicar_botao_login()
time.sleep(3)
class TesteModulo(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = gerenciador_driver.ClienteDriver().obter_driver()
@classmethod
def tearDownClass(cls):
gerenciador_driver.ClienteDriver().obter_driver().quit()
def testar_navegacao_modulo(self):
from src.paginas import pagina_modulo
modulo = pagina_modulo.PaginaModulo(self.driver)
modulo.clicar_menu_sistema()
modulo.clicar_submenu_produtos()
if __name__ == '__main__':
unittest.main()
Ao executar os testes, o driver é inicializado apenas uma vez, reuitlizado em todas as classes, evitando reinícios desnecessários do aplicativo.