Appium Capacidades desejadas para Android emulador

⚡ Resumo Inteligente

As capacidades desejadas são os pares chave-valor e Appium O cliente envia um comando ao abrir uma sessão, informando ao servidor qual plataforma, dispositivo, driver e aplicativo o teste automatizado deve utilizar.

  • ???? Sessão comtract: As funcionalidades são transmitidas no corpo JSON da solicitação de nova sessão e não podem ser alteradas posteriormente.
  • ☑️ Android Essenciais: appPackage e appActivity nomeiam o aplicativo e a tela. Appium deve lançar.
  • Variantes de espera: appWaitPackage e appWaitActivity protegem as telas de apresentação que aparecem antes do ponto de entrada real.
  • 🧪 Appium Prefixo 2: Agora, todas as funcionalidades não padronizadas precisam do prefixo appium: vendor, caso contrário, o servidor as rejeita.
  • 🛠️ EQUIPAMENTOS Java cliente: DesiredCapabilities deu lugar a UiAutomator2Options e XCUITestOptions em Selenium 4.
  • 📊 Encontrando valores: Uma consulta `adb dumpsys` ou a classe `PackageManager` revela os nomes dos pacotes e atividades.

Appium pares de chave-valor de capacidades desejadas para um Android sessão do emulador

Quais são as capacidades desejadas

As 'Capacidades Desejadas' nos ajudam a modificar o comportamento do servidor durante a automação. Appium É um mapa hash, ou par chave-valor, usado para enviar um comando para o Appium servidor, onde cada comando do cliente é executado no contexto de uma sessão.

Por exemplo, um cliente envia uma solicitação POST /session contendo um objeto JSON para o Appium servidor.

Assim, para enviar uma solicitação ou manter uma sessão com o servidor, utiliza-se um conjunto de pares de chave e valor. Isso é conhecido como 'Desired Capabilities' (Capacidades Desejadas).

import io.appium.java_client.AppiumDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
{
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("deviceName","Android Emulator");
        capabilities.setCapability("platformVersion", "4.4");
}

Papel importante da capacidade desejada

  • As 'DesiredCapabilities' ajudam o usuário a controlar a solicitação de sessão com o servidor. Por exemplo, para uma sessão iOS, definimos a capacidade platformName = iOS e para uma sessão não iOS, definimos platformName = ['platformName'] ... Android nomeDaPlataformaDaSessão = Android.
  • As 'DesiredCapabilities' são usadas para configurar a instância do WebDriver, por exemplo. FirefoxDriver, ChromeDriver ou InternetExplorerDriver.
  • DesiredCapability é muito útil para Selenium Grid. Por exemplo, é usado para executar diferentes casos de teste em navegadores e sistemas operacionais diferentes. Com base na capacidade declarada, o hub do Grid aponta para o nó correspondente. Os nós são definidos usando os métodos de propriedade 'set':
    DesiredCapabilities obj = new DesiredCapabilities(); 
    obj.setBrowserName("firefox"); 
    obj.setVersion("18.0.1"); 
    obj.setPlatform(org.openqa.selenium.Platform.WINDOWS);					
    
  • Uma funcionalidade desejada é um pacote definido pela biblioteca. Antes de usar 'DesiredCapabilities', ela deve ser importada da biblioteca abaixo.
    Org.openqa.selenium.remote.DesiredCapabilities

Appium suporta ambos Android e iOS, portanto, há um conjunto separado de Appium Capacidades do servidor para cada plataforma.

A tabela abaixo mostra alguns usos comuns. Android capacidades e valores a serem utilizados.

Capacidades Descrição Valores/Usos
appPacote Ligue para o número desejado Java pacote em Android que o usuário deseja executar

Valor = com.example.myapp/

Obj.setCapability(“appPackage”, “com.whatsapp”);

atividade do aplicativo Atividade do aplicativo que o usuário deseja iniciar a partir do pacote.

Valor = MainActivity, .Settings

Obj.setCapability(“appActivity”, “com.whatsapp.Main”);

appWaitPackage Pacote que o aplicativo precisa aguardar Valor=com.example.android.myapp
appWaitActivity Qualquer Android atividade que o usuário precisa esperar

Valor = SplashActivity

capacidades.setCapability (“appWaitActivity”, “com.example.game.SplashActivity”)

NOTA: consulte o Appium documentação para ver mais Android capacidades.

A tabela abaixo mostra algumas funcionalidades do iOS comumente usadas e os valores a serem utilizados.

Capacidades Descrição Valores
Tempo limite de lançamento Tempo total (em ms) de espera pela instrumentação. 2000
VOCE FEZ Para identificar o número de dispositivo exclusivo de um dispositivo físico conectado. 166aestu4

NOTA: consulte o Appium guia de recursos Para visualizar mais recursos do iOS.

Como as capacidades desejadas mudaram em Appium 2

Os exemplos acima são provenientes de Appium A primeira era ainda mostra o formato de um conjunto de capacidades, mas duas regras foram alteradas e ambas impedirão o início de uma sessão moderna.

Em primeiro lugar, a especificação WebDriver do W3C define apenas um pequeno conjunto de recursos padrão, dos quais platformName e browserName Este é o ponto principal. Todas as outras funcionalidades são extensões de fornecedor e devem conter um prefixo de namespace terminado em dois pontos. AppiumO prefixo de 's é appium:. Assim deviceName torna-se appium:deviceName e platformVersion torna-se appium:platformVersion. Appium 2 também requer appium:automationName, porque os drivers são instalados separadamente, em vez de serem incluídos no pacote do servidor.

Em segundo lugar, repetir o prefixo torna-se tedioso, então Appium aceita um único appium:options Capacidade cujo valor é um objeto. As capacidades dentro desse objeto não precisam de prefixo e, quando um nome aparece tanto dentro quanto fora do objeto, o valor interno prevalece.

{
    "platformName": "iOS",
    "appium:options": {
        "automationName": "XCUITest",
        "platformVersion": "16.0",
        "app": "/path/to/your.app",
        "deviceName": "iPhone 12",
        "noReset": true
    }
}

⚠️ Nota de versão: na Java lado, Selenium 4 e Appium Java O cliente 8 descontinuou o DesiredCapabilities Classe mostrada anteriormente. Construtores específicos do driver herdados de BaseOptions substitua-o — UiAutomator2Options pela Android e XCUITestOptions para iOS — com um mapa um para umping de cada velho setCapability chamada. O código original acima é mantido aqui como exemplo histórico.

ExtracInformações sobre pacotes e atividades

Pacotes são arquivos ou classes agrupados. Eles fornecem uma estrutura organizada para a programação modular. JavaEm aplicações móveis, diferentes pacotes são armazenados em um único arquivo JAR, e o usuário pode chamar esse JAR para execução completa. Um conceito semelhante é seguido no desenvolvimento de aplicações móveis.

De acordo com o relatório Android sistema operacional, todos os aplicativos são instalados na forma de Java pacotes. Então, para extracinformações do caminho do pacote t, o Android A classe PackageManager é usada.

Ele recupera informações sobre pacotes e atividades de aplicativos pré-instalados e pós-instalados no dispositivo.

Você pode obter uma instância da classe PackageManager chamando o método getPackageManager(). Esse método permite acessar e manipular os pacotes e as permissões relacionadas dos aplicativos instalados.

Por exemplo:

PackageManager pManager = getPackageManager();
List<ApplicationInfo> list = pManager.getInstalledApplications(PackageManager.GET_META_DATA)

Como encontrar appPackage e appActivity com adb

A rota do PackageManager acima funciona de dentro de um aplicativo. Como testador, você geralmente tem apenas a versão instalada, então o caminho mais rápido é uma consulta sobre adb contra um dispositivo conectado ou emulador.

Abra o aplicativo manualmente no dispositivo e, em seguida, execute um dos comandos abaixo em um terminal na pasta platform-tools. O comando imprime a janela que está em foco no momento e o valor é formatado como package/activity.

adb shell dumpsys window | find "mCurrentFocus"
adb shell dumpsys window windows | grep -i "mCurrentFocus"

Use o primeiro formulário no Windows prompt de comando e o segundo em um shell Unix ou Git Bash. Leia o resultado como duas metades: tudo antes da barra é o valor de appPackagee tudo o que vem depois é o valor de appActivity.

Duas ressalvas se aplicam. A atividade em foco é aquela que está na tela naquele momento, que nem sempre é a atividade com a qual o aplicativo inicia — se uma sessão falhar durante a inicialização do driver, inicie o aplicativo novamente e leia o valor mais uma vez. E se uma tela de apresentação (splash screen) aparecer primeiro, a atividade de entrada será diferente daquela que você deseja usar para a verificação, que é exatamente o caso. appWaitActivity existe para.

Uma alternativa visual é uiautomatorviewer, que captura a hierarquia atual da tela e mostra o pacote e a classe de cada nó.

Erros comuns nas capacidades desejadas e como corrigi-los

A maioria falhou Appium As sessões são encerradas antes da execução de qualquer etapa de teste, e a causa quase sempre está no conjunto de recursos, e não no teste em si. A tabela abaixo relaciona cada mensagem à sua respectiva solução.

Mensagem Causa provável Fixar
Capacidade do WebDriver inválida ou não suportada Uma funcionalidade não padrão foi enviada sem o prefixo do fornecedor. Adicione `appium:` a ele ou mova-o para dentro de `appium:options`.
As funcionalidades desejadas devem incluir um nome de automação ou um nome de plataforma. Appium 2 não pode escolher um motorista Defina platformName e appium:automationName explicitamente.
Não foi possível iniciar o aplicativo. Erro original: a atividade usada para iniciar o aplicativo não existe. appActivity não corresponde ao manifesto. Releia o valor com o comando dumpsys acima.
A sessão não foi iniciada: nenhum dispositivo encontrado. Não há emulador ou aparelho conectado. Confirme o dispositivo com o comando `adb devices` antes de iniciar.
Não foi possível criar uma nova sessão após o tempo limite. Uma tela inicial atrasa a atividade de entrada. Defina appWaitActivity e aumente appWitDuration.
O estado da aplicação não é redefinido entre execuções. O comportamento de reinicialização padrão foi alterado. RevVerifique appium:noReset e appium:fullReset para a execução desejada.

Quando uma sessão se recusar a iniciar, leia o Appium log do servidor em vez da pilha do cliente trace. O servidor indica qual funcionalidade não pôde ser atendida, e essa linha especifica a solução.

Perguntas Frequentes

Não. platformName e browserName são recursos padrão do W3C e permanecem sem prefixo. Todos os outros. Appium A capacidade, incluindo deviceName e platformVersion, é uma extensão do fornecedor e precisa do prefixo appium:.

As ferramentas de aprendizado de máquina em nuvens de dispositivos sugerem um conjunto de recursos a partir da compilação e do dispositivo de destino, e sinalizam valores que falharam em sessões semelhantes. Considere a saída como um rascunho e confirme cada nome na documentação do driver.

O Copilot completa blocos de capacidade comuns, mas foi treinado em muitos outros. Appium O código 1 frequentemente omite o prefixo ou sugere a classe obsoleta DesiredCapabilities. Verifique cada sugestão em relação ao guia atual.

appPackage nomeia o pacote Appium inicia. appWaitPackage nomeia o pacote Appium Aguarda o aparecimento do arquivo antes de retornar o controle, o que é importante quando um iniciador ou tela de apresentação carrega um pacote diferente primeiro.

platformName definido como iOS e appium:automationName definido como XCUITest. O driver XCUITest também precisa de pelo menos um dos seguintes parâmetros: appium:app, appium:bundleId ou browserName; caso contrário, ele abre uma sessão na tela inicial.

O número de segundos que o servidor aguarda que o cliente envie seu próximo comando. Se o tempo de espera for excedido, o servidor assume que o cliente se desconectou e encerra a sessão, o que geralmente parece uma falha aleatória.

A opção `noReset` ignora a reinicialização usual, permitindo que os dados do aplicativo permaneçam após o término da sessão. A opção `fullReset` adiciona etapas extras, como desinstalar e reinstalar o aplicativo, para garantir a máxima reprodutibilidade. Ambas as opções são desativadas por padrão e não devem ser ativadas simultaneamente.

Não. Os recursos são parâmetros para iniciar a sessão e são fixos após sua criação. Quando um driver permite que um comportamento seja alterado durante a sessão, ele expõe uma configuração por meio da API de Configurações.

Resuma esta postagem com: