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: