View a markdown version of this page

Interagindo com o dispositivo usando o Appium - AWS Device Farm

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Interagindo com o dispositivo usando o Appium

Depois de criar uma sessão de acesso remoto, o dispositivo estará disponível para testes do Appium. Durante toda a sessão de acesso remoto, você pode executar quantas sessões do Appium quiser no dispositivo, sem limites de quais clientes você usa. Por exemplo, você pode começar executando um teste usando o código Appium local do seu IDE e, em seguida, passar a usar o Appium Inspector para solucionar quaisquer problemas encontrados. A sessão pode durar até 150 minutos, no entanto, se não houver atividade por mais de 5 minutos (seja por meio do console interativo ou por meio do endpoint Appium), a sessão expirará.

Usando aplicativos para testar com sua sessão do Appium

Há várias maneiras de fornecer um aplicativo para uso com sua sessão do Appium:

  • Faça upload de um aplicativo para o Device Farm e instale-o na sessão.

  • Especifique um URL HTTPS ou um URI do Amazon S3 como recurso. appium:app

  • Faça referência a um aplicativo já instalado pelo nome do pacote (usando appium:appPackage no Android ou no appium:bundleId iOS).

  • Teste um aplicativo da web especificando o browserName recurso (Chromeno Android, Safari no iOS).

Os limites padrão de tamanho do aplicativo (4 GB) se aplicam a todas as fontes de aplicativos.

nota

O Device Farm não suporta a passagem de um caminho de sistema de arquivos local appium:app durante uma sessão de acesso remoto.

Carregando, instalando e usando aplicativos

Para usar um aplicativo carregado com sua sessão do Appium, siga estas etapas:

  1. Carregue e instale seu aplicativo

    Há duas maneiras de carregar e instalar um aplicativo no dispositivo em teste:

    • Inclua o ARN do aplicativo em sua CreateRemoteAccessSessionsolicitação. O aplicativo é instalado automaticamente no dispositivo quando a sessão é iniciada. Você também pode incluir um aplicativo auxiliar ARNs, que será instalado junto com o aplicativo principal.

    • Instale o aplicativo durante uma sessão ativa usando a InstallToRemoteAccessSessionAPI ou fazendo o upload por meio do console do Device Farm. Isso permite que você altere o aplicativo em teste sem criar uma nova sessão.

  2. Use o aplicativo instalado

    Depois de instalado, o aplicativo é injetado automaticamente como o appium:app recurso padrão para qualquer sessão subsequente do Appium. Se você incluiu aplicativos auxiliares, eles serão definidos como o appium:otherApps recurso.

    Por exemplo, se você criar uma sessão de acesso remoto usando com.aws.devicefarm.sample como seu aplicativo e com.aws.devicefarm.other.sample como um de seus aplicativos auxiliares, ao criar uma sessão do Appium, ela terá recursos semelhantes aos seguintes:

    { "value": { "sessionId": "abcdef123456-1234-5678-abcd-abcdef123456", "capabilities": { "app": "/tmp/com.aws.devicefarm.sample.apk", "otherApps": "[\"/tmp/com.aws.devicefarm.other.sample.apk\"]", ... } } }

    Se você instalar um novo aplicativo durante a sessão, ele substituirá o appium:app recurso atual. Se o aplicativo instalado anteriormente tiver um nome de pacote distinto, ele permanecerá no dispositivo e será transferido para o appium:otherApps recurso.

    Por exemplo, se você usar inicialmente com.aws.devicefarm.sample ao criar sua sessão de acesso remoto, mas depois instalar com.aws.devicefarm.other.sample durante a sessão, suas sessões do Appium terão recursos semelhantes aos seguintes:

    { "value": { "sessionId": "abcdef123456-1234-5678-abcd-abcdef123456", "capabilities": { "app": "/tmp/com.aws.devicefarm.other.sample.apk", "otherApps": "[\"/tmp/com.aws.devicefarm.sample.apk\"]", ... } } }
nota

Para obter mais informações sobre o upload automático de aplicativos como parte de sua sessão de acesso remoto, consulte Como automatizar o upload de aplicativos.

Usando um URL HTTPS

Você pode especificar um URL HTTPS acessível ao público como o recurso appium:app desejado ao criar uma sessão do Appium. O URL deve apontar diretamente para um arquivo de aplicativo que pode ser baixado (por exemplo, um .ipa arquivo .apk ou). O Device Farm baixa o aplicativo a partir do URL especificado e o instala no dispositivo em teste.

Importante

Somente HTTPS URLs são compatíveis. O HTTP simples URLs é rejeitado.

Por exemplo, a seguinte solicitação de criação de sessão do Appium baixa um aplicativo a partir de uma URL HTTPS:

{ "capabilities": { "alwaysMatch": {}, "firstMatch": [ { "appium:app": "https://example.com/path/to/MyApp.apk" } ] } }

Usando um URI do Amazon S3

Você pode especificar um URI do Amazon S3 (por exemplo,s3://my-bucket/path/to/MyApp.ipa) como o recurso appium:app desejado ao criar uma sessão do Appium. O Device Farm baixa o aplicativo do local especificado do S3 e o instala no dispositivo em teste.

Para usar um URI do S3, os seguintes requisitos devem ser atendidos:

  • A sessão de acesso remoto deve ser iniciada a partir de um projeto que tenha uma função de execução do IAM configurada.

  • A função de execução do IAM deve ter uma duração máxima de sessão de pelo menos 150 minutos, porque a função é assumida durante a sessão de acesso remoto.

  • A função de execução do IAM deve ter permissão para chamar s3:GetObject o objeto S3 especificado no URI. Também recomendamos conceder s3:HeadObject permissão para o mesmo objeto, o que permite que o Device Farm valide a existência do objeto antes de tentar o download.

Por exemplo, a seguinte solicitação de criação de sessão do Appium baixa um aplicativo de um URI do S3:

{ "capabilities": { "alwaysMatch": {}, "firstMatch": [ { "appium:app": "s3://my-test-bucket/apps/MyApp.ipa" } ] } }

Veja a seguir um exemplo de política de permissões do IAM que concede o acesso recomendado para baixar um aplicativo do Amazon S3, incluindo a permissão opcionals3:HeadObject. Para obter mais informações sobre como configurar as funções de execução do IAM, consulteAcesse os recursos da AWS usando uma função de execução do IAM.

exemplo
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:HeadObject" ], "Resource": "arn:aws:s3:::my-test-bucket/apps/*" } ] }

Usando um aplicativo já instalado

Se o aplicativo que você deseja testar já estiver instalado no dispositivo, você pode referenciá-lo diretamente pelo nome do pacote em vez de fazer o upload. Use os appium:appActivity recursos appium:appPackage e no Android ou o appium:bundleId recurso no iOS.

Por exemplo, a seguinte solicitação de criação de sessão do Appium inicia um aplicativo Android já instalado:

{ "capabilities": { "alwaysMatch": {}, "firstMatch": [ { "appium:appPackage": "com.example.myapp", "appium:appActivity": "com.example.myapp.MainActivity" } ] } }

No iOS, use appium:bundleId em vez disso:

{ "capabilities": { "alwaysMatch": {}, "firstMatch": [ { "appium:bundleId": "com.example.myapp" } ] } }

Testando um aplicativo web

Para testar um aplicativo web, especifique o browserName recurso em sua solicitação de criação de sessão do Appium. Use Chrome em dispositivos Safari Android ou iOS.

Por exemplo, a solicitação a seguir abre o Chrome em um dispositivo Android:

{ "capabilities": { "alwaysMatch": {}, "firstMatch": [ { "browserName": "Chrome" } ] } }

Como usar o endpoint Appium

Aqui estão as etapas para acessar o endpoint Appium da sessão a partir do console AWS CLI, do e. AWS SDKs Essas etapas incluem como começar a executar testes usando várias estruturas de teste de clientes da Appium:

Console
  1. Abra sua página de sessão de acesso remoto em seu navegador da web:

    A página da sessão de acesso remoto
  2. Para executar uma sessão usando o Appium Inspector, faça o seguinte:

    1. Clique no botão Configurar sessão do Appium

    2. Siga as instruções na página sobre como iniciar uma sessão usando o Appium Inspector.

  3. Para executar um teste Appium a partir do seu IDE local, faça o seguinte:

    1. Clique no ícone “copiar” ao lado do texto URL do endpoint Appium

    2. Cole esse URL em seu código Appium local onde quer que você especifique atualmente seu endereço remoto ou executor de comando. Para exemplos específicos do idioma, clique em uma das guias nesta janela de exemplo para o idioma de sua escolha.

AWS CLI

Primeiro, verifique se sua versão da AWS CLI é baixando e up-to-date instalando a versão mais recente.

Importante

O campo de endpoint do Appium não está disponível em versões mais antigas da AWS CLI.

Quando sua sessão estiver em execução, o URL do endpoint do Appium estará disponível por meio de um campo nomeado remoteDriverEndpoint na resposta a uma chamada para a API: GetRemoteAccessSession

$ aws devicefarm get-remote-access-session \ --arn "arn:aws:devicefarm:us-west-2:123456789876:session:abcdef123456-1234-5678-abcd-abcdef123456/abcdef123456-1234-5678-abcd-abcdef123456/00000"

Isso mostrará uma saída como a seguinte:

{ "remoteAccessSession": { "arn": "arn:aws:devicefarm:us-west-2:111122223333:session:abcdef123456-1234-5678-abcd-abcdef123456/abcdef123456-1234-5678-abcd-abcdef123456/00000", "name": "Google Pixel 8", "status": "RUNNING", "endpoints": { "remoteDriverEndpoint": "https://devicefarm-interactive-global.us-west-2.api.aws/remote-endpoint/ABCD1234...", ... }

Você pode usar essa URL em seu código Appium local onde quer que você especifique atualmente seu endereço remoto ou executor de comando. Para exemplos específicos do idioma, clique em uma das guias nesta janela de exemplo para o idioma de sua escolha.

Para ver um exemplo de como interagir com o endpoint diretamente da linha de comando, você pode usar a ferramenta de linha de comando curl para chamar um endpoint diretamente: WebDriver

$ curl "https://devicefarm-interactive-global.us-west-2.api.aws/remote-endpoint/ABCD1234.../status"

Isso mostrará uma saída como a seguinte:

{ "value": { "ready": true, "message": "The server is ready to accept new connections", "build": { "version": "2.5.1" } } }
Python

Quando sua sessão estiver em execução, o URL do endpoint do Appium estará disponível por meio de um campo nomeado remoteDriverEndpoint na resposta a uma chamada para a API: GetRemoteAccessSession

# To get the URL import sys import boto3 from botocore.exceptions import ClientError def get_appium_endpoint() -> str: session_arn = "arn:aws:devicefarm:us-west-2:111122223333:session:abcdef123456-1234-5678-abcd-abcdef123456/abcdef123456-1234-5678-abcd-abcdef123456/00000" device_farm_client = boto3.client("devicefarm", region_name="us-west-2") try: resp = device_farm_client.get_remote_access_session(arn=session_arn) except ClientError as exc: sys.exit(f"Failed to call Device Farm: {exc}") remote_access_session = resp.get("remoteAccessSession", {}) endpoints = remote_access_session.get("endpoints", {}) endpoint = endpoints.get("remoteDriverEndpoint") if not endpoint: sys.exit("Device Farm response did not include endpoints.remoteDriverEndpoint") return endpoint # To use the URL from appium import webdriver from appium.options.android import UiAutomator2Options opts = UiAutomator2Options() driver = webdriver.Remote(get_appium_endpoint(), options=opts) # ... driver.quit()
Java

Observação: este exemplo usa o AWS SDK for Java v2 e é compatível com as versões 11 e superiores do JDK.

Quando sua sessão estiver em execução, o URL do endpoint do Appium estará disponível por meio de um campo nomeado remoteDriverEndpoint na resposta a uma chamada para a API: GetRemoteAccessSession

// To get the URL import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.devicefarm.DeviceFarmClient; import software.amazon.awssdk.services.devicefarm.model.GetRemoteAccessSessionRequest; import software.amazon.awssdk.services.devicefarm.model.GetRemoteAccessSessionResponse; public class AppiumEndpointBuilder { public static String getAppiumEndpoint() throws Exception { String session_arn = "arn:aws:devicefarm:us-west-2:111122223333:session:abcdef123456-1234-5678-abcd-abcdef123456/abcdef123456-1234-5678-abcd-abcdef123456/00000"; try (DeviceFarmClient client = DeviceFarmClient.builder() .region(Region.US_WEST_2) .credentialsProvider(DefaultCredentialsProvider.create()) .build()) { GetRemoteAccessSessionResponse resp = client.getRemoteAccessSession( GetRemoteAccessSessionRequest.builder().arn(session_arn).build() ); String endpoint = resp.remoteAccessSession().endpoints().remoteDriverEndpoint(); if (endpoint == null || endpoint.isEmpty()) { throw new IllegalStateException("remoteDriverEndpoint missing from response"); } return endpoint; } } } // To use the URL import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.android.options.UiAutomator2Options; import java.net.URL; public class ExampleTest { public static void main(String[] args) throws Exception { String endpoint = AppiumEndpointBuilder.getAppiumEndpoint(); UiAutomator2Options options = new UiAutomator2Options(); AndroidDriver driver = new AndroidDriver(new URL(endpoint), options); try { // ... your test ... } finally { driver.quit(); } } }
JavaScript

Observação: este exemplo usa AWS SDK para JavaScript v3 e WebDriverIO v8+ usando o Node 18+.

Quando sua sessão estiver em execução, o URL do endpoint do Appium estará disponível por meio de um campo nomeado remoteDriverEndpoint na resposta a uma chamada para a API: GetRemoteAccessSession

// To get the URL import { DeviceFarmClient, GetRemoteAccessSessionCommand } from "@aws-sdk/client-device-farm"; export async function getAppiumEndpoint() { const sessionArn = "arn:aws:devicefarm:us-west-2:111122223333:session:abcdef123456-1234-5678-abcd-abcdef123456/abcdef123456-1234-5678-abcd-abcdef123456/00000"; const client = new DeviceFarmClient({ region: "us-west-2" }); const resp = await client.send(new GetRemoteAccessSessionCommand({ arn: sessionArn })); const endpoint = resp?.remoteAccessSession?.endpoints?.remoteDriverEndpoint; if (!endpoint) throw new Error("remoteDriverEndpoint missing from response"); return endpoint; } // To use the URL with WebdriverIO import { remote } from "webdriverio"; (async () => { const endpoint = await getAppiumEndpoint(); const u = new URL(endpoint); const driver = await remote({ protocol: u.protocol.replace(":", ""), hostname: u.hostname, port: u.port ? Number(u.port) : (u.protocol === "https:" ? 443 : 80), path: u.pathname + u.search, capabilities: { platformName: "Android", "appium:automationName": "UiAutomator2", // ...other caps... }, }); try { // ... your test ... } finally { await driver.deleteSession(); } })();
C#

Quando sua sessão estiver em execução, o URL do endpoint do Appium estará disponível por meio de um campo nomeado remoteDriverEndpoint na resposta a uma chamada para a API: GetRemoteAccessSession

// To get the URL using System; using System.Threading.Tasks; using Amazon; using Amazon.DeviceFarm; using Amazon.DeviceFarm.Model; public static class AppiumEndpointBuilder { public static async Task<string> GetAppiumEndpointAsync() { var sessionArn = "arn:aws:devicefarm:us-west-2:111122223333:session:abcdef123456-1234-5678-abcd-abcdef123456/abcdef123456-1234-5678-abcd-abcdef123456/00000"; var config = new AmazonDeviceFarmConfig { RegionEndpoint = RegionEndpoint.USWest2 }; using var client = new AmazonDeviceFarmClient(config); var resp = await client.GetRemoteAccessSessionAsync(new GetRemoteAccessSessionRequest { Arn = sessionArn }); var endpoint = resp?.RemoteAccessSession?.Endpoints?.RemoteDriverEndpoint; if (string.IsNullOrWhiteSpace(endpoint)) throw new InvalidOperationException("RemoteDriverEndpoint missing from response"); return endpoint; } } // To use the URL using OpenQA.Selenium.Appium; using OpenQA.Selenium.Appium.Android; class Example { static async Task Main() { var endpoint = await AppiumEndpointBuilder.GetAppiumEndpointAsync(); var options = new AppiumOptions(); options.PlatformName = "Android"; options.AutomationName = "UiAutomator2"; using var driver = new AndroidDriver(new Uri(endpoint), options); try { // ... your test ... } finally { driver.Quit(); } } }
Ruby

Quando sua sessão estiver em execução, o URL do endpoint do Appium estará disponível por meio de um campo nomeado remoteDriverEndpoint na resposta a uma chamada para a API: GetRemoteAccessSession

# To get the URL require 'aws-sdk-devicefarm' def get_appium_endpoint session_arn = "arn:aws:devicefarm:us-west-2:111122223333:session:abcdef123456-1234-5678-abcd-abcdef123456/abcdef123456-1234-5678-abcd-abcdef123456/00000" client = Aws::DeviceFarm::Client.new(region: 'us-west-2') resp = client.get_remote_access_session(arn: session_arn) endpoint = resp.remote_access_session.endpoints.remote_driver_endpoint raise "remote_driver_endpoint missing from response" if endpoint.nil? || endpoint.empty? endpoint end # To use the URL require 'appium_lib_core' endpoint = get_appium_endpoint opts = { server_url: endpoint, capabilities: { 'platformName' => 'Android', 'appium:automationName' => 'UiAutomator2' } } driver = Appium::Core.for(opts).start_driver begin # ... your test ... ensure driver.quit end