Criar uma sessão de acesso remoto no AWS Device Farm - 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á.

Criar uma sessão de acesso remoto no AWS Device Farm

Para obter informações sobre sessões de acesso remoto, consulte Sessões.

Pré-requisitos

Crie uma sessão remota

Console
  1. Faça login no console do Device Farm em https://console.aws.amazon.com/devicefarm.

  2. No painel de navegação do Device Farm, escolha Teste para dispositivos móveis e, em seguida, Projetos.

  3. Se você já tiver um projeto, selecione-o na lista. Caso contrário, crie um projeto seguindo as instruções em Criar um projeto no AWS Device Farm.

  4. Na guia Acesso remoto, escolha Criar sessão de acesso remoto.

  5. Escolha um dispositivo para sua sessão. Você pode escolher na lista de dispositivos disponíveis ou pesquisar um dispositivo usando a barra de pesquisa na parte superior da lista.

  6. (Opcional) Inclua um aplicativo e aplicativos auxiliares como parte da sessão. Eles podem ser aplicativos recém-carregados ou aplicativos enviados anteriormente neste projeto nos últimos 30 dias (após 30 dias, os uploads de aplicativos expirarão).

  7. Em Session name (Nome da sessão), insira um nome para a sessão.

  8. Escolha Confirm and start session (Confirmar e iniciar sessão).

AWS CLI

Observação: essas instruções se concentram somente na criação de uma sessão de acesso remoto. Para obter instruções sobre como fazer upload de um aplicativo para uso durante sua sessão, consulte Como automatizar o upload de aplicativos.

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

Importante

Alguns comandos mencionados neste documento não estão disponíveis em versões mais antigas da AWS CLI.

Em seguida, você pode determinar em qual dispositivo você gostaria de testar:

$ aws devicefarm list-devices

Isso mostrará uma saída como a seguinte:

{ "devices": [ { "arn": "arn:aws:devicefarm:us-west-2::device:DE5BD47FF3BD42C3A14BF7A6EFB1BFE7", "name": "Google Pixel 8", "remoteAccessEnabled": true, "availability": "HIGHLY_AVAILABLE" ... }, ... ] }

Em seguida, você pode criar sua sessão de acesso remoto com um ARN de dispositivo de sua escolha:

$ aws devicefarm create-remote-access-session \ --project-arn arn:aws:devicefarm:us-west-2:111122223333:project:12345678-1111-2222-333-456789abcdef \ --device-arn arn:aws:devicefarm:us-west-2::device:DE5BD47FF3BD42C3A14BF7A6EFB1BFE7 \ --app-arn arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcdef \ --configuration '{ "auxiliaryApps": [ "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcde0", "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcde1" ] }'

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

Agora, opcionalmente, podemos fazer uma pesquisa e esperar que a sessão esteja pronta:

$ POLL_INTERVAL=3 TIMEOUT=600 DEADLINE=$(( $(date +%s) + TIMEOUT )) while [[ "$(date +%s)" -lt "$DEADLINE" ]]; do STATUS=$(aws devicefarm get-remote-access-session \ --arn "$DEVICE_FARM_SESSION_ARN" \ --query 'remoteAccessSession.status' \ --output text) case "$STATUS" in RUNNING) echo "Session is ready with status: $STATUS" break ;; STOPPING|COMPLETED) echo "Session ended early with status: $STATUS" exit 1 ;; esac done
Python

Observação: essas instruções se concentram somente na criação de uma sessão de acesso remoto. Para obter instruções sobre como fazer upload de um aplicativo para uso durante sua sessão, consulte Como automatizar o upload de aplicativos.

Este exemplo primeiro encontra qualquer dispositivo Google Pixel disponível no Device Farm, depois cria uma sessão de acesso remoto com ele e espera até que a sessão seja executada.

import random import time import boto3 client = boto3.client("devicefarm", region_name="us-west-2") # 1) Gather all matching devices via paginated ListDevices with filters filters = [ {"attribute": "MODEL", "operator": "CONTAINS", "values": ["Pixel"]}, {"attribute": "AVAILABILITY", "operator": "EQUALS", "values": ["AVAILABLE"]}, ] matching_arns = [] next_token = None while True: args = {"filters": filters} if next_token: args["nextToken"] = next_token page = client.list_devices(**args) for d in page.get("devices", []): matching_arns.append(d["arn"]) next_token = page.get("nextToken") if not next_token: break if not matching_arns: raise RuntimeError("No available Google Pixel device found.") # Randomly select one device from the full matching set device_arn = random.choice(matching_arns) print("Selected device ARN:", device_arn) # 2) Create remote access session and wait until RUNNING resp = client.create_remote_access_session( projectArn="arn:aws:devicefarm:us-west-2:111122223333:project:12345678-1111-2222-333-456789abcdef", deviceArn=device_arn, appArn="arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcdef", # optional configuration={ "auxiliaryApps": [ # optional "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcde0", "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcde1", ] }, ) session_arn = resp["remoteAccessSession"]["arn"] print(f"Created Remote Access Session: {session_arn}") poll_interval = 3 timeout = 600 deadline = time.time() + timeout terminal_states = ["STOPPING", "COMPLETED"] while True: out = client.get_remote_access_session(arn=session_arn) status = out["remoteAccessSession"]["status"] print(f"Current status: {status}") if status == "RUNNING": print(f"Session is ready with status: {status}") break if status in terminal_states: raise RuntimeError(f"Session ended early with status: {status}") if time.time() >= deadline: raise RuntimeError("Timed out waiting for session to be ready.") time.sleep(poll_interval)
Java

Observação: essas instruções se concentram somente na criação de uma sessão de acesso remoto. Para obter instruções sobre como fazer upload de um aplicativo para uso durante sua sessão, consulte Como automatizar o upload de aplicativos.

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

Este exemplo primeiro encontra qualquer dispositivo Google Pixel disponível no Device Farm, depois cria uma sessão de acesso remoto com ele e espera até que a sessão seja executada.

import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.ThreadLocalRandom; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.devicefarm.DeviceFarmClient; import software.amazon.awssdk.services.devicefarm.model.CreateRemoteAccessSessionConfiguration; import software.amazon.awssdk.services.devicefarm.model.CreateRemoteAccessSessionRequest; import software.amazon.awssdk.services.devicefarm.model.CreateRemoteAccessSessionResponse; import software.amazon.awssdk.services.devicefarm.model.Device; import software.amazon.awssdk.services.devicefarm.model.DeviceFilter; import software.amazon.awssdk.services.devicefarm.model.DeviceFilterAttribute; import software.amazon.awssdk.services.devicefarm.model.GetRemoteAccessSessionRequest; import software.amazon.awssdk.services.devicefarm.model.GetRemoteAccessSessionResponse; import software.amazon.awssdk.services.devicefarm.model.ListDevicesRequest; import software.amazon.awssdk.services.devicefarm.model.ListDevicesResponse; import software.amazon.awssdk.services.devicefarm.model.RuleOperator; public class CreateRemoteAccessSession { public static void main(String[] args) throws Exception { DeviceFarmClient client = DeviceFarmClient.builder() .region(Region.US_WEST_2) .build(); String projectArn = "arn:aws:devicefarm:us-west-2:111122223333:project:12345678-1111-2222-333-456789abcdef"; String appArn = "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcdef"; String aux1 = "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcde0"; String aux2 = "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcde1"; // 1) Gather all matching devices via paginated ListDevices with filters List<DeviceFilter> filters = Arrays.asList( DeviceFilter.builder() .attribute(DeviceFilterAttribute.MODEL) .operator(RuleOperator.CONTAINS) .values("Pixel") .build(), DeviceFilter.builder() .attribute(DeviceFilterAttribute.AVAILABILITY) .operator(RuleOperator.EQUALS) .values("AVAILABLE") .build() ); List<String> matchingDeviceArns = new ArrayList<>(); String next = null; do { ListDevicesResponse page = client.listDevices( ListDevicesRequest.builder().filters(filters).nextToken(next).build()); for (Device d : page.devices()) { matchingDeviceArns.add(d.arn()); } next = page.nextToken(); } while (next != null); if (matchingDeviceArns.isEmpty()) { throw new RuntimeException("No available Google Pixel device found."); } // Randomly select one device from the full matching set String deviceArn = matchingDeviceArns.get( ThreadLocalRandom.current().nextInt(matchingDeviceArns.size())); System.out.println("Selected device ARN: " + deviceArn); // 2) Create Remote Access session and wait until it is RUNNING CreateRemoteAccessSessionConfiguration cfg = CreateRemoteAccessSessionConfiguration.builder() .auxiliaryApps(Arrays.asList(aux1, aux2)) .build(); CreateRemoteAccessSessionResponse res = client.createRemoteAccessSession( CreateRemoteAccessSessionRequest.builder() .projectArn(projectArn) .deviceArn(deviceArn) .appArn(appArn) // optional .configuration(cfg) // optional .build()); String sessionArn = res.remoteAccessSession().arn(); System.out.println("Created Remote Access Session: " + sessionArn); int pollIntervalMs = 3000; long timeoutMs = 600_000L; long deadline = System.currentTimeMillis() + timeoutMs; while (true) { GetRemoteAccessSessionResponse get = client.getRemoteAccessSession( GetRemoteAccessSessionRequest.builder().arn(sessionArn).build()); String status = get.remoteAccessSession().statusAsString(); System.out.println("Current status: " + status); if ("RUNNING".equals(status)) { System.out.println("Session is ready with status: " + status); break; } if ("STOPPING".equals(status) || "COMPLETED".equals(status)) { throw new RuntimeException("Session ended early with status: " + status); } if (System.currentTimeMillis() >= deadline) { throw new RuntimeException("Timed out waiting for session to be ready."); } Thread.sleep(pollIntervalMs); } } }
JavaScript

Observação: essas instruções se concentram somente na criação de uma sessão de acesso remoto. Para obter instruções sobre como fazer upload de um aplicativo para uso durante sua sessão, consulte Como automatizar o upload de aplicativos.

Observação: este exemplo usa o AWS SDK para JavaScript v3.

Este exemplo primeiro encontra qualquer dispositivo Google Pixel disponível no Device Farm, depois cria uma sessão de acesso remoto com ele e espera até que a sessão seja executada.

import { DeviceFarmClient, ListDevicesCommand, CreateRemoteAccessSessionCommand, GetRemoteAccessSessionCommand, } from "@aws-sdk/client-device-farm"; const client = new DeviceFarmClient({ region: "us-west-2" }); // 1) Gather all matching devices via paginated ListDevices with filters const filters = [ { attribute: "MODEL", operator: "CONTAINS", values: ["Pixel"] }, { attribute: "AVAILABILITY", operator: "EQUALS", values: ["AVAILABLE"] }, ]; let nextToken; const matching = []; while (true) { const page = await client.send(new ListDevicesCommand({ filters, nextToken })); for (const d of page.devices ?? []) { matching.push(d.arn); } nextToken = page.nextToken; if (!nextToken) break; } if (matching.length === 0) { throw new Error("No available Google Pixel device found."); } // Randomly select one device from the full matching set const deviceArn = matching[Math.floor(Math.random() * matching.length)]; console.log("Selected device ARN:", deviceArn); // 2) Create remote access session and wait until RUNNING const out = await client.send(new CreateRemoteAccessSessionCommand({ projectArn: "arn:aws:devicefarm:us-west-2:111122223333:project:12345678-1111-2222-333-456789abcdef", deviceArn, appArn: "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcdef", // optional configuration: { auxiliaryApps: [ // optional "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcde0", "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcde1", ], }, })); const sessionArn = out.remoteAccessSession?.arn; console.log("Created Remote Access Session:", sessionArn); const pollIntervalMs = 3000; const timeoutMs = 600000; const deadline = Date.now() + timeoutMs; while (true) { const get = await client.send(new GetRemoteAccessSessionCommand({ arn: sessionArn })); const status = get.remoteAccessSession?.status; console.log("Current status:", status); if (status === "RUNNING") { console.log("Session is ready with status:", status); break; } if (status === "STOPPING" || status === "COMPLETED") { throw new Error(`Session ended early with status: ${status}`); } if (Date.now() >= deadline) { throw new Error("Timed out waiting for session to be ready."); } await new Promise((r) => setTimeout(r, pollIntervalMs)); }
C#

Observação: essas instruções se concentram somente na criação de uma sessão de acesso remoto. Para obter instruções sobre como fazer upload de um aplicativo para uso durante sua sessão, consulte Como automatizar o upload de aplicativos.

Este exemplo primeiro encontra qualquer dispositivo Google Pixel disponível no Device Farm, depois cria uma sessão de acesso remoto com ele e espera até que a sessão seja executada.

using System; using System.Collections.Generic; using System.Threading.Tasks; using Amazon; using Amazon.DeviceFarm; using Amazon.DeviceFarm.Model; class Program { static async Task Main() { var client = new AmazonDeviceFarmClient(RegionEndpoint.USWest2); // 1) Gather all matching devices via paginated ListDevices with filters var filters = new List<DeviceFilter> { new DeviceFilter { Attribute = DeviceAttribute.MODEL, Operator = RuleOperator.CONTAINS, Values = new List<string>{ "Pixel" } }, new DeviceFilter { Attribute = DeviceAttribute.AVAILABILITY, Operator = RuleOperator.EQUALS, Values = new List<string>{ "AVAILABLE" } }, }; var matchingArns = new List<string>(); string nextToken = null; do { var list = await client.ListDevicesAsync(new ListDevicesRequest { Filters = filters, NextToken = nextToken }); foreach (var d in list.Devices) matchingArns.Add(d.Arn); nextToken = list.NextToken; } while (nextToken != null); if (matchingArns.Count == 0) throw new Exception("No available Google Pixel device found."); // Randomly select one device from the full matching set var rnd = new Random(); var deviceArn = matchingArns[rnd.Next(matchingArns.Count)]; Console.WriteLine($"Selected device ARN: {deviceArn}"); // 2) Create remote access session and wait until RUNNING var request = new CreateRemoteAccessSessionRequest { ProjectArn = "arn:aws:devicefarm:us-west-2:111122223333:project:12345678-1111-2222-333-456789abcdef", DeviceArn = deviceArn, AppArn = "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcdef", // optional Configuration = new CreateRemoteAccessSessionConfiguration { AuxiliaryApps = new List<string> { "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcde0", "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcde1" } } }; request.Configuration.AuxiliaryApps.RemoveAll(string.IsNullOrWhiteSpace); var response = await client.CreateRemoteAccessSessionAsync(request); var sessionArn = response.RemoteAccessSession.Arn; Console.WriteLine($"Created Remote Access Session: {sessionArn}"); var pollIntervalMs = 3000; var timeoutMs = 600000; var deadline = DateTime.UtcNow.AddMilliseconds(timeoutMs); while (true) { var get = await client.GetRemoteAccessSessionAsync(new GetRemoteAccessSessionRequest { Arn = sessionArn }); var status = get.RemoteAccessSession.Status.Value; Console.WriteLine($"Current status: {status}"); if (status == "RUNNING") { Console.WriteLine($"Session is ready with status: {status}"); break; } if (status == "STOPPING" || status == "COMPLETED") { throw new Exception($"Session ended early with status: {status}"); } if (DateTime.UtcNow >= deadline) { throw new TimeoutException("Timed out waiting for session to be ready."); } await Task.Delay(pollIntervalMs); } } }
Ruby

Observação: essas instruções se concentram somente na criação de uma sessão de acesso remoto. Para obter instruções sobre como fazer upload de um aplicativo para uso durante sua sessão, consulte Como automatizar o upload de aplicativos.

Este exemplo primeiro encontra qualquer dispositivo Google Pixel disponível no Device Farm, depois cria uma sessão de acesso remoto com ele e espera até que a sessão seja executada.

require 'aws-sdk-devicefarm' client = Aws::DeviceFarm::Client.new(region: 'us-west-2') # 1) Gather all matching devices via paginated ListDevices with filters filters = [ { attribute: 'MODEL', operator: 'CONTAINS', values: ['Pixel'] }, { attribute: 'AVAILABILITY', operator: 'EQUALS', values: ['AVAILABLE'] }, ] matching_arns = [] next_token = nil loop do resp = client.list_devices(filters: filters, next_token: next_token) resp.devices&.each { |d| matching_arns << d.arn } next_token = resp.next_token break unless next_token end abort "No available Google Pixel device found." if matching_arns.empty? # Randomly select one device from the full matching set device_arn = matching_arns.sample puts "Selected device ARN: #{device_arn}" # 2) Create remote access session and wait until RUNNING resp = client.create_remote_access_session( project_arn: "arn:aws:devicefarm:us-west-2:111122223333:project:12345678-1111-2222-333-456789abcdef", device_arn: device_arn, app_arn: "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcdef", # optional configuration: { auxiliary_apps: [ # optional "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcde0", "arn:aws:devicefarm:us-west-2:111122223333:upload:12345678-1111-2222-333-456789abcdef/12345678-1111-2222-333-456789abcde1" ].compact } ) session_arn = resp.remote_access_session.arn puts "Created Remote Access Session: #{session_arn}" poll_interval = 3 timeout = 600 deadline = Time.now + timeout terminal = %w[STOPPING COMPLETED] loop do get = client.get_remote_access_session(arn: session_arn) status = get.remote_access_session.status puts "Current status: #{status}" if status == 'RUNNING' puts "Session is ready with status: #{status}" break end abort "Session ended early with status: #{status}" if terminal.include?(status) abort "Timed out waiting for session to be ready." if Time.now >= deadline sleep poll_interval end

Próximas etapas

O Device Farm inicia a sessão assim que o dispositivo e a infraestrutura solicitados estão disponíveis, normalmente em alguns minutos. A caixa de diálogo Dispositivo solicitado ficará aberta até o momento em que a sessão iniciar. Para cancelar a solicitação de sessão, escolha Cancel request (Cancelar solicitação).

Se o dispositivo selecionado estiver indisponível ou ocupado, o status da sessão será exibido como Dispositivo pendente, indicando que talvez seja necessário aguardar algum tempo até que o dispositivo esteja disponível para teste.

Se sua conta atingiu o limite de simultaneidade para dispositivos públicos com ou sem medição, o status da sessão será exibido como Simultaneidade pendente. Para slots de dispositivos ilimitados, você pode aumentar a simultaneidade comprando mais slots de dispositivos. Para pay-as-you-go dispositivos medidos, entre em contato com a AWS por meio de um ticket de suporte para solicitar um aumento na cota de serviço.

Quando a configuração da sessão começa, ela mostra primeiro um status de Em andamento e, em seguida, um status de Conexão enquanto seu navegador local tenta abrir uma conexão remota com o dispositivo.

Depois que a sessão for iniciada, se tiver que fechar o navegador ou a guia do navegador sem interromper a sessão ou se a conexão entre o navegador e a internet se perder, a sessão permanecerá ativa por cinco minutos. Depois disso, o Device Farm encerra a sessão. A conta é cobrada pelo tempo ocioso.

Após o início da sessão, você pode interagir com o dispositivo no navegador da web ou testar o dispositivo usando o Appium.