View a markdown version of this page

Interazione con il dispositivo tramite Appium - AWS Device Farm

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Interazione con il dispositivo tramite Appium

Dopo aver creato una sessione di accesso remoto, il dispositivo sarà disponibile per i test di Appium. Per tutta la durata della sessione di accesso remoto, puoi eseguire tutte le sessioni Appium che desideri sul dispositivo, senza limiti sui client che utilizzi. Ad esempio, puoi iniziare eseguendo un test utilizzando il codice Appium locale dal tuo IDE, quindi passare a utilizzare Appium Inspector per risolvere eventuali problemi riscontrati. La sessione può durare fino a 150 minuti. Limiti del servizio Tuttavia, se non c'è attività per più di 5 minuti (tramite la console interattiva o l'endpoint Appium), la sessione scade.

Utilizzo delle app per i test con la sessione Appium

Esistono diversi modi per fornire un'app da utilizzare con la sessione Appium:

  • Carica un'app su Device Farm e installala nella sessione.

  • Specifica un URL HTTPS o un URI Amazon Simple Storage Service (Amazon S3) come appium:app funzionalità.

  • Fai riferimento a un'app già installata tramite il nome del pacchetto (appium:appPackagesu Android o appium:bundleId iOS).

  • Prova un'app Web specificandone la browserName funzionalità (Chromesu Android, Safari su iOS).

I limiti di dimensione standard delle app (4 GB) si applicano a tutte le fonti di app.

Nota

Device Farm non supporta il passaggio di un percorso del file system locale appium:app durante una sessione di accesso remoto.

Caricamento, installazione e utilizzo delle app

Per utilizzare un'app caricata con la tua sessione Appium, segui questi passaggi:

  1. Carica e installa la tua app

    Esistono due modi per caricare e installare un'app sul dispositivo in fase di test:

    • Includi l'ARN dell'app nella tua CreateRemoteAccessSession richiesta. L'app viene installata automaticamente sul dispositivo all'avvio della sessione. Puoi anche includere ARN delle app ausiliarie, che verranno installati insieme all'app principale.

    • Installa l'app durante una sessione attiva utilizzando l'InstallToRemoteAccessSessionAPI o caricandola tramite la console Device Farm. Ciò consente di modificare l'app in fase di test senza creare una nuova sessione.

  2. Usa l'app installata

    Una volta installata, l'app viene inserita automaticamente come appium:app funzionalità predefinita per tutte le successive sessioni di Appium. Se hai incluso app ausiliarie, vengono impostate come funzionalità. appium:otherApps

    Ad esempio, se crei una sessione di accesso remoto utilizzando com.aws.dev.rproxy.goskope.comicefarm.sample come app e com.aws.dev.rproxy.goskope.comicefarm.other.sample come app ausiliaria, quando crei una sessione Appium, questa avrà funzionalità simili alle seguenti:

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

    Se installi una nuova app durante la sessione, questa sostituisce la funzionalità corrente. appium:app Se l'app precedentemente installata ha un nome di pacchetto distinto, rimane sul dispositivo e passa alla appium:otherApps funzionalità.

    Ad esempio, se com.aws.dev.rproxy.goskope.comicefarm.sample si utilizza inizialmente durante la creazione della sessione di accesso remoto, ma poi si installa com.aws.dev.rproxy.goskope.comicefarm.other.sample durante la sessione, le sessioni di Appium avranno funzionalità simili alle seguenti:

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

Per ulteriori informazioni sul caricamento automatico delle app come parte della sessione di accesso remoto, consulta. Automazione di Device Farm

Usare un URL HTTPS

È possibile specificare un URL HTTPS accessibile al pubblico come funzionalità appium:app desiderata durante la creazione di una sessione Appium. L'URL deve puntare direttamente a un file dell'app scaricabile (ad esempio, un .apk file or). .ipa Device Farm scarica l'app dall'URL specificato e la installa sul dispositivo in fase di test.

Importante

Sono supportati solo gli URL HTTPS. Gli URL HTTP semplici vengono rifiutati.

Ad esempio, la seguente richiesta di creazione di una sessione Appium scarica un'app da un URL HTTPS:

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

Utilizzo di un URI Amazon S3

Puoi specificare un URI Amazon S3 (ad esempios3://amzn-s3-demo-bucket/path/to/MyApp.ipa) come funzionalità appium:app desiderata durante la creazione di una sessione Appium. Device Farm scarica l'app dalla posizione Amazon S3 specificata e la installa sul dispositivo in fase di test.

Per utilizzare un URI Amazon S3, devono essere soddisfatti i seguenti requisiti:

  • La sessione di accesso remoto deve essere avviata da un progetto in cui è configurato un ruolo di esecuzione IAM.

  • Il ruolo di esecuzione IAM deve avere una durata massima della sessione di almeno 150 minuti. Questo è il caso perché il ruolo viene assunto per tutta la durata della sessione di accesso remoto.

  • Il ruolo di esecuzione IAM deve disporre dell'autorizzazione per chiamare s3:GetObject l'oggetto S3 specificato nell'URI. Questa autorizzazione autorizza anche la chiamata HeadObject API sullo stesso oggetto, il che consente a Device Farm di convalidare l'esistenza dell'oggetto prima di tentare il download.

Ad esempio, la seguente richiesta di creazione di una sessione Appium scarica un'app da un URI Amazon S3:

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

Di seguito è riportato un esempio di policy di autorizzazioni IAM che concede l'accesso consigliato per scaricare un'app da Amazon S3. L's3:GetObjectautorizzazione autorizza anche la chiamata HeadObject API, che viene utilizzata per convalidare l'esistenza dell'oggetto. Per ulteriori informazioni sulla configurazione dei ruoli di esecuzione IAM, consulta. Accedi alle risorse AWS utilizzando un ruolo di esecuzione IAM

Esempio
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/apps/*" } ] }

Utilizzo di un'app già installata

Se l'app che desideri testare è già installata sul dispositivo, puoi farvi riferimento direttamente tramite il nome del pacchetto invece di caricarla. Usa le appium:appActivity funzionalità appium:appPackage e su Android o la appium:bundleId funzionalità su iOS.

Ad esempio, la seguente richiesta di creazione di una sessione Appium avvia un'app Android già installata:

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

Su iOS, usa invece: appium:bundleId

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

Test di un'app Web

Per testare un'app Web, specifica la browserName funzionalità nella richiesta di creazione della sessione Appium. Utilizzalo Chrome su dispositivi Android o Safari su dispositivi iOS.

Ad esempio, la seguente richiesta apre Chrome su un dispositivo Android:

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

Come usare l'endpoint Appium

Ecco i passaggi per accedere all'endpoint Appium della sessione dalla console, dagli SDK e dagli SDK. AWS CLI AWS Questi passaggi includono come iniziare a eseguire i test utilizzando vari framework di test dei client Appium:

Console
  1. Apri la pagina della sessione di accesso remoto nel tuo browser web:

    La pagina della sessione di accesso remoto
  2. Per eseguire una sessione utilizzando Appium Inspector, procedi come segue:

    1. Scegli Setup Appium session.

    2. Segui le istruzioni sulla pagina per iniziare una sessione utilizzando Appium Inspector.

  3. Per eseguire un test Appium dal tuo IDE locale, procedi come segue:

    1. Scegli l'icona di copia accanto all'URL dell'endpoint Appium.

    2. Incolla l'URL copiato nel codice Appium locale ovunque tu specifichi attualmente il tuo indirizzo remoto o l'esecutore dei comandi. Per esempi specifici della lingua, consulta le altre schede di questa sezione.

AWS CLI

Innanzitutto, verifica che la tua AWS CLI versione sia aggiornata scaricando e installando la versione più recente.

Importante

Il campo Appium endpoint non è disponibile nelle versioni precedenti di. AWS CLI

Una volta che la sessione sarà attiva e funzionante, l'URL dell'endpoint Appium sarà disponibile tramite un campo denominato remoteDriverEndpoint nella risposta a una chiamata all'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"

Questo mostrerà un output come il seguente:

{ "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...", ... }

Puoi usare questo URL nel tuo codice Appium locale ovunque tu specifichi attualmente il tuo indirizzo remoto o l'esecutore dei comandi. Per esempi specifici della lingua, fai clic su una delle schede in questa finestra di esempio per la lingua desiderata.

Per un esempio di come interagire con l'endpoint direttamente dalla riga di comando, puoi usare lo strumento da riga di comando curl per chiamare direttamente un endpoint: WebDriver

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

Questo mostrerà un output come il seguente:

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

Una volta che la sessione sarà attiva e funzionante, l'URL dell'endpoint Appium sarà disponibile tramite un campo denominato remoteDriverEndpoint nella risposta a una chiamata all'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

Nota: questo esempio utilizza l' AWS SDK per Java v2 ed è compatibile con le versioni JDK 11 e successive.

Una volta che la sessione sarà attiva e funzionante, l'URL dell'endpoint Appium sarà disponibile tramite un campo denominato remoteDriverEndpoint nella risposta a una chiamata all'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

Nota: questo esempio utilizza AWS SDK per JavaScript v3 e WebDriverIO v8+ utilizzando Node 18+.

Una volta che la sessione sarà attiva e funzionante, l'URL dell'endpoint Appium sarà disponibile tramite un campo denominato remoteDriverEndpoint nella risposta a una chiamata all'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#

Una volta che la sessione sarà attiva e funzionante, l'URL dell'endpoint Appium sarà disponibile tramite un campo denominato remoteDriverEndpoint nella risposta a una chiamata all'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

Una volta che la sessione sarà attiva e funzionante, l'URL dell'endpoint Appium sarà disponibile tramite un campo denominato remoteDriverEndpoint nella risposta a una chiamata all'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