Executando Múltiplos Serviços Appium para Testes em Dispositivos Múltiplos

Preparação do Ambiente

Para começar, é necessário ter um dispositivo físico e um emulador (neste exemplo, estamos usando o "Nox Emulator"). Primeiro, verifique se os dispositivos são detectados pelo comando:

adb devices

Se o emulador não for detectado (mesmo com o Nox Emulator em execução), siga estas etapas de configuração:

  1. Localize o caminho de instalação do adb e encontre o arquivo adb.exe
  2. Copie o adb.exe para a pasta bin do diretório de instalação do Nox Emulator e renomeie-o para nox_adb.exe
  3. Como já existe um arquivo com o mesmo nome, faça uma cópia de segurança do arquivo nox_adb.exe existente, adicionando _1 ao nome para diferenciá-lo
  4. Execute novamente o comando adb devices para verificar se o emulador é detectado

Se o dispositivo físico estiver conectado, ele será detectado, mas o emulador pode não aparecer. Nesse caso, use o comando:

adb connect 127.0.0.1:62001

Agora ambos os dispositivos (físico e eumlador) devem ser detectados quando você executar adb devices.

Iniciando Múltiplos Serviços Appium

Antes de prosseguir, certifique-se de ter os módulos necessários instalados:

pip install pyyaml
pip install tomorrow

Método 1: Iniciando serviços Appium via linha de comando

Para o primiero serviço Appium (dispositivo físico):

appium -a 127.0.0.1 -p 4723 -bp 4726 -U ML5RRPCUWO

Para o segundo serviço Appium (emulador Nox):

appium -a 127.0.0.1 -p 4724 -bp 4725 -U 127.0.0.1:62001

O parâmetro -bp especifica a porta bootstrap, que deve ser diferante para cada serviço quando vários Appiums são executados simultaneamente.

Método 2: Automatizando o início dos serviços com Python

Aqui está um exemplo de código Python para iniciar e gerenciar múltiplos serviços Appium:


import os
import time
import yaml
from tomorrow import threads

def iniciar_servico_appium(porta, bootstrap, udid):
    """
    Inicia um serviço Appium se não estiver em execução
    """
    # Verifica se a porta já está em uso
    processo = os.popen('netstat -ano | findstr "%s"' % porta)
    time.sleep(2)
    saida = processo.read()
    
    if "LISTENING" in saida:
        print("Serviço Appium já está ativo na porta %s" % porta)
    else:
        # Inicia o serviço Appium
        comando = "start /b appium -a 127.0.0.1 -p %s -bp %s -U %s" % (porta, bootstrap, udid)
        os.system(comando)
        print("Serviço Appium iniciado na porta %s" % porta)

def parar_servicos_appium():
    """
    Encerra todos os processos Appium em execução
    """
    os.system("start /b taskkill /F /t /IM node.exe")
    print("Todos os serviços Appium foram encerrados")

def obter_configuracao_yaml(nome_dispositivo):
    """
    Lê as configurações desejadas de um arquivo YAML para um dispositivo específico
    """
    caminho_yaml = os.path.join("caminho/para/seu/arquivo", "config_appium.yaml")
    
    with open(caminho_yaml, "r", encoding="utf-8") as arquivo:
        dados_yaml = yaml.load(arquivo, Loader=yaml.FullLoader)
    
    for config in dados_yaml:
        if nome_dispositivo in config["descricao"]:
            # Inicia o serviço para este dispositivo
            iniciar_servico_appium(
                porta=config['porta'],
                bootstrap=config['porta_bootstrap'],
                udid=config['config_caps']['udid']
            )
            return config['config_caps'], config['porta']
    
    print("Dispositivo não encontrado nas configurações")
    return None, None

@threads(2)
def executar_teste_dispositivo(nome_dispositivo):
    """
    Executa testes em um dispositivo específico
    """
    # Obtém as configurações desejadas
    caps, porta = obter_configuracao_yaml(nome_dispositivo)
    
    if caps is None:
        return
    
    # Inicia a sessão WebDriver
    driver = webdriver.Remote('http://127.0.0.1:%s/wd/hub' % porta, caps)
    
    try:
        # Realiza os testes
        # Exemplo: login
        pagina_login = LoginPage(driver)
        pagina_login.inserir_usuario(usuario)
        pagina_login.inserir_senha(senha)
        pagina_login.clicar_botao_entrar()
        
        # Aguarda a conclusão
        driver.implicitly_wait(3)
        time.sleep(5)
        
    finally:
        # Fecha a sessão
        driver.quit()

if __name__ == "__main__":
    dispositivos = ["Nox_Emulator", "Dispositivo_Fisico"]
    
    for dispositivo in dispositivos:
        executar_teste_dispositivo(dispositivo)
    
    # Encerra todos os serviços Appium ao final
    parar_servicos_appium()

Configuração com Arquivo YAML

Para gerenciar múltiplas configurações de dispositivos, use um arquivo YAML. Exemplo:


- descricao: Dispositivo_Fisico_Samsung, porta_appium_4723
  porta: 4723
  porta_bootstrap: 4726
  config_caps:
    platformName: Android
    deviceName: ML5RRPCUWO
    appPackage: com.seuapp.android
    noReset: true
    platformVersion: 10
    udid: ML5RRPCUWO
    appActivity: .ui.login.SplashActivity
    newCommandTimeout: 120

- descricao: Emulador_Nox, porta_appium_4724
  porta: 4724
  porta_bootstrap: 4725
  config_caps:
    platformName: Android
    deviceName: 127.0.0.1:62001
    appPackage: com.seuapp.android
    noReset: true
    platformVersion: 8.0
    udid: 127.0.0.1:62001
    appActivity: .ui.login.SplashActivity
    newCommandTimeout: 120

Este arquivo YAML permite gerenciar facilmente as configurações para múltiplos dispositivos, com descrições claras para identificação.

Tags: Appium automação-mobile testes-mobile ADB YAML

Publicado em 6-21 00:27