Interactuar con el dispositivo mediante Appium - AWS Device Farm

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Interactuar con el dispositivo mediante Appium

Una vez que haya creado una sesión de acceso remoto, el dispositivo estará disponible para las pruebas de Appium. Durante toda la sesión de acceso remoto, puedes ejecutar tantas sesiones de Appium como desees en el dispositivo, sin límites en cuanto a los clientes que utilices. Por ejemplo, puede empezar por ejecutar una prueba con el código Appium local de su IDE y, a continuación, pasar a utilizar el Inspector de Appium para solucionar cualquier problema que encuentre. La sesión puede durar hasta 150 minutos; sin embargo, si no hay actividad durante más de 5 minutos (ya sea a través de la consola interactiva o del terminal de Appium), se agotará el tiempo de espera de la sesión.

Uso de aplicaciones para realizar pruebas con tu sesión de Appium

Device Farm te permite usar tus aplicaciones como parte de tu solicitud de creación de sesión de acceso remoto o instalar aplicaciones durante la propia sesión de acceso remoto. Estas aplicaciones se instalan automáticamente en el dispositivo que se está probando y se incorporan como funciones predeterminadas para cualquier solicitud de sesión de Appium. Al crear una sesión de acceso remoto, tiene la opción de transferir un ARN de aplicación, que se utilizará de forma predeterminada como appium:app capacidad para todas las sesiones de Appium posteriores, así como una aplicación auxiliar ARNs, que se utilizará como capacidad. appium:otherApps

Por ejemplo, si crea una sesión de acceso remoto con una aplicación com.aws.devicefarm.sample como aplicación y com.aws.devicefarm.other.sample como una de sus aplicaciones auxiliares, cuando vaya a crear una sesión de Appium, tendrá capacidades similares a las siguientes:

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

Durante la sesión, puedes instalar aplicaciones adicionales (ya sea dentro de la consola o mediante la InstallToRemoteAccessSessionAPI). Estas anularán cualquier aplicación existente que se haya utilizado anteriormente como appium:app capacidad. Si esas aplicaciones utilizadas anteriormente tienen un nombre de paquete distinto, permanecerán en el dispositivo y se utilizarán como parte de la appium:otherApps capacidad.

Por ejemplo, si inicialmente usas una aplicación com.aws.devicefarm.sample al crear tu sesión de acceso remoto, pero luego instalas una nueva aplicación con el nombre com.aws.devicefarm.other.sample durante la sesión, tus sesiones de Appium tendrán capacidades similares a las siguientes:

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

Si lo prefieres, puedes especificar de forma explícita las capacidades de tu aplicación mediante el nombre de la aplicación (utilizando las appium:bundleId capacidades appium:appPackage o las capacidades para Android e iOS, respectivamente).

Si estás probando una aplicación web, especifica la browserName capacidad de tu solicitud de creación de sesión de Appium. El Chrome navegador está disponible en todos los dispositivos Android y en todos los dispositivos iOS. Safari

Device Farm no admite el paso de una URL remota o una ruta del sistema de archivos local appium:app durante una sesión de acceso remoto. Cargue aplicaciones a Device Farm e inclúyalas en la sesión.

nota

Para obtener más información sobre la carga automática de aplicaciones como parte de tu sesión de acceso remoto, consulta cómo automatizar la carga de aplicaciones.

¿Cómo usar el terminal de Appium?

Estos son los pasos para acceder al punto final de Appium de la sesión desde la consola, el y el AWS CLI. AWS SDKs Estos pasos incluyen cómo empezar a ejecutar pruebas utilizando varios marcos de pruebas de clientes de Appium:

Console
  1. Abre la página de sesión de acceso remoto en tu navegador web:

    La página de sesión de acceso remoto
  2. Para ejecutar una sesión con Appium Inspector, haga lo siguiente:

    1. Haga clic en el botón Configurar sesión de Appium

    2. Siga las instrucciones de la página sobre cómo iniciar una sesión con Appium Inspector.

  3. Para ejecutar una prueba de Appium desde tu IDE local, haz lo siguiente:

    1. Haga clic en el icono de «copiar» situado junto al texto de la URL del punto de conexión de Appium

    2. Pegue esta URL en su código local de Appium donde especifique actualmente su dirección remota o ejecutor de comandos. Para ver ejemplos de idiomas específicos, haga clic en una de las pestañas de esta ventana de ejemplo para el idioma que prefiera.

AWS CLI

En primer lugar, compruebe que su versión de AWS CLI esté up-to-date disponible descargando e instalando la versión más reciente.

importante

El campo de punto final de Appium no está disponible en las versiones anteriores de la AWS CLI.

Una vez que la sesión esté activa, la URL del punto de conexión de Appium estará disponible en un campo cuyo nombre aparece remoteDriverEndpoint en la respuesta a una llamada a la 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"

Esto mostrará un resultado como el siguiente:

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

Puedes usar esta URL en tu código local de Appium siempre que especifiques actualmente tu dirección remota o tu ejecutor de comandos. Para ver ejemplos de idiomas específicos, haga clic en una de las pestañas de esta ventana de ejemplo para seleccionar el idioma que prefiera.

Para ver un ejemplo de cómo interactuar con el punto final directamente desde la línea de comandos, puedes usar la herramienta de línea de comandos curl para llamar directamente al punto final: WebDriver

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

Esto mostrará un resultado como el siguiente:

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

Una vez que la sesión esté en marcha, la URL del punto final de Appium estará disponible en un campo denominado remoteDriverEndpoint en la respuesta a una llamada a la GetRemoteAccessSessionAPI:

# 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: este ejemplo usa el AWS SDK para Java v2 y es compatible con las versiones 11 y superiores de JDK.

Una vez que la sesión esté en marcha, la URL del punto final de Appium estará disponible en un campo denominado remoteDriverEndpoint en la respuesta a una llamada a la 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: en este ejemplo se usa el AWS SDK para la versión JavaScript 3 y WebDriverIO para la versión 8+ con Node 18+.

Una vez que la sesión esté en marcha, la URL del punto final de Appium estará disponible en un campo denominado remoteDriverEndpoint en la respuesta a una llamada a la 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 vez que la sesión esté activa, la URL del punto de conexión de Appium estará disponible en un campo denominado remoteDriverEndpoint en la respuesta a una llamada a la 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 vez que la sesión esté activa, la URL del punto de conexión de Appium estará disponible en un campo denominado remoteDriverEndpoint en la respuesta a una llamada a la 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