---
modificationDate: November 12, 2026
title: Control a remote simulator with agent-device, Argent, or Appium
description: Open apps, press buttons, enter text, and read the accessibility tree on an Expo Simulators session through simulator:exec and a controller.
---

This documentation is available as Markdown for AI agents and LLMs. See the [full Markdown index](https://docs.expo.dev/llms.txt) or append .md to any documentation URL.

# Control a remote simulator with agent-device, Argent, or Appium

Open apps, press buttons, enter text, and read the accessibility tree on an Expo Simulators session through simulator:exec and a controller.

<AgentInstructions>

## Submitting Feedback

If you encounter errors, misleading or outdated information, report it so Expo can be improved:

Preferred command:
npx --yes submit-expo-feedback@latest --category docs --subject "/eas/simulators/how-to/drive-the-device/" "<actionable feedback>"

Direct HTTP fallback:
curl -X POST https://api.expo.dev/v2/feedback/docs-send -H 'Content-Type: application/json' -d '{"url":"/eas/simulators/how-to/drive-the-device/","feedback":"🤖 Agent feedback for docs: <specific, actionable description> (<model>, <harness>)"}'

Only submit when you have something specific and actionable to report. Try to give the most context.

## Navigation

When answering a related or follow-up question, fetch the relevant page below as Markdown (.md) instead of guessing; use llms.txt for the full map.

You are here: Expo Services > Expo Simulators > How-to
Pages in this section:
- [Start a session](https://docs.expo.dev/eas/simulators/how-to/start-a-session.md)
- [Install your app](https://docs.expo.dev/eas/simulators/how-to/install-your-app.md)
- [Drive the device](https://docs.expo.dev/eas/simulators/how-to/drive-the-device.md) (this page)
- [Use EAS CLI controls](https://docs.expo.dev/eas/simulators/how-to/control-with-eas-cli.md)
- [Iterate on your code](https://docs.expo.dev/eas/simulators/how-to/iterate-on-your-code.md)
- [Capture evidence](https://docs.expo.dev/eas/simulators/how-to/capture-evidence.md)
- [Organize sessions](https://docs.expo.dev/eas/simulators/how-to/organize-sessions.md)
- [Verify a change with an agent](https://docs.expo.dev/eas/simulators/how-to/verify-a-change-with-an-agent.md)
- [Work without a Mac](https://docs.expo.dev/eas/simulators/how-to/work-without-a-mac.md)
- [Review a pull request](https://docs.expo.dev/eas/simulators/how-to/review-a-pull-request.md)
- [Run in CI](https://docs.expo.dev/eas/simulators/how-to/run-in-ci.md)
- [Hand off a session](https://docs.expo.dev/eas/simulators/how-to/hand-off-a-session.md)
- [Embed a session](https://docs.expo.dev/eas/simulators/how-to/embed-a-session.md)
Full documentation tree: [llms.txt](https://docs.expo.dev/llms.txt)

</AgentInstructions>

Use a **controller** for accessibility snapshots and actions that select elements by their labels. The controller comes from the `--type` that you selected when the session started. Run each controller command through `eas simulator:exec`, which loads the connection details for the active session and then runs the command.

For direct iOS actions, use [`eas simulator:control`](https://docs.expo.dev/eas/simulators/how-to/control-with-eas-cli.md). It also works in an iOS `web-preview-only` session.

## How `simulator:exec` works

`simulator:exec` reads **.env.eas-simulator**, adds its values to the environment, and runs the command that follows. It does not implement device actions itself. There is no `simulator:tap` command.

| Controller | Variables that `simulator:exec` loads | Command pattern |
| --- | --- | --- |
| agent-device | `AGENT_DEVICE_DAEMON_BASE_URL`, `AGENT_DEVICE_DAEMON_AUTH_TOKEN` | `eas simulator:exec npx agent-device@latest <command> [args]` |
| Argent | `ARGENT_TOOLS_URL` and, when required, `ARGENT_AUTH_TOKEN` | `eas simulator:exec argent run <tool> [args]` |
| Appium | `APPIUM_URL`, `APPIUM_CAPS` | `eas simulator:exec <appium-client> [args]` |

Each session type provisions only its own controller. For example, agent-device commands do not work in an Argent session. A `web-preview-only` session has no controller. See [Expo Simulators session types](https://docs.expo.dev/eas/simulators/reference/session-types.md).

## Control the app with agent-device

[agent-device](https://docs.expo.dev/agents/agent-device.md) is an open source command-line controller from Callstack. It runs on demand through `npx`, so you do not need to install it globally.

### Open an app

```sh
eas simulator:exec npx agent-device@latest apps --platform ios
eas simulator:exec npx agent-device@latest open com.example.app --platform ios
```

`apps` lists the apps that you installed. Add `--all` to include system apps.

### Read the screen and press an element

Take a snapshot of the interactive accessibility tree:

```sh
eas simulator:exec npx agent-device@latest snapshot -i
```

The snapshot returns references such as `@e1` and `@e2`. Press an element by its reference or by a selector:

```sh
eas simulator:exec npx agent-device@latest press @e2
eas simulator:exec npx agent-device@latest press 'label="Continue"'
```

To press an element, use `press` or `click`.

On iOS, a snapshot can take tens of seconds. If an action times out, take a new snapshot before you try again. The first action can reach the device even when the response is late, so a second attempt can do the action two times.

### Enter text and scroll

```sh
eas simulator:exec npx agent-device@latest fill @e4 "hello@example.com"
eas simulator:exec npx agent-device@latest scroll down
eas simulator:exec npx agent-device@latest gesture swipe left
```

### Open a deep link

```sh
eas simulator:exec npx agent-device@latest open "myapp://profile/42" --platform ios
```

The first time a scheme opens, iOS can show an **Open in** dialog. Accept it with `alert accept`. You can also start the session with `--open-url`. Expo Simulators then tries to approve the scheme so that the dialog does not appear. `--open-url` requires an application source, such as `--build-id`. See [Install an app on a remote Android Emulator or iOS Simulator](https://docs.expo.dev/eas/simulators/how-to/install-your-app.md).

Do not open the browser preview URL on the device. The preview URL is a browser stream for people, not a deep link.

### Read the full command list

agent-device includes help text that is written for agents. Read the version that matches the session:

```sh
eas simulator:exec npx agent-device@latest help
eas simulator:exec npx agent-device@latest help workflow
```

## Control the app with Argent

[Argent](https://docs.expo.dev/agents/argent.md) is a controller from Software Mansion. Install its CLI, then run its tools through `simulator:exec`:

```sh
npm install --global @swmansion/argent
eas simulator:exec argent run list-devices
eas simulator:exec argent run screenshot --udid <udid>
```

Argent tools need an explicit `--udid`. Use the booted device from `list-devices`. Argent gesture tools take coordinates from 0.0 to 1.0, not pixels.

To use Argent through its Model Context Protocol (MCP) server instead, link the session credentials. Use `--yes` so that a new token replaces an old one:

```sh
argent link '<ARGENT_TOOLS_URL>' --token '<ARGENT_AUTH_TOKEN>' --yes
```

If your editor already runs `argent mcp`, restart the editor so that it uses the new link.

## Control the app with Appium

Start an `appium` session, then run your Appium client through `simulator:exec`. Configure the client to read the server URL from `APPIUM_URL` and the capabilities from `APPIUM_CAPS`, which contains JSON:

```sh
eas simulator:start --platform ios --type appium --name "Checkout flow tests" --non-interactive
eas simulator:exec <appium-client> [args...]
```

For more information, see [Run Appium tests on a remote Android Emulator or iOS Simulator](https://docs.expo.dev/eas/simulators/works-with/appium.md).

## Control the device from a browser

Every session type includes a live browser preview. Open the browser preview URL from the start output, or select **Open preview** on the session page on expo.dev, to see the device. On iOS, you can also interact with it. In `--json` output, the URL is `remoteConfig.webPreviewUrl`, or `remoteConfig.previewUrl` for a `web-preview-only` session. By default, the URL requires an Expo login with access to the project. See [Share a live Expo Simulators session or start one from a link](https://docs.expo.dev/eas/simulators/how-to/hand-off-a-session.md).

The session page on expo.dev shows an **Open preview** button that opens the browser preview in a new tab.

On iOS, browser input in the preview resets the idle timer. Watching the preview does not reset it. Browser input on Android does not reset it. See [How long an Expo Simulators session runs](https://docs.expo.dev/eas/simulators/how-it-works/session-lifetime.md).

## Common questions

#### Why does a controller command say that the remote daemon is unavailable?

The controller connection dropped, or the session stopped. A dropped connection also removes the installed app state and the snapshot references. Stop the session if it is still active, start a new session, and repeat the install, open, and drive steps. See [Troubleshoot Expo Simulators](https://docs.expo.dev/eas/simulators/troubleshooting.md).

#### Can I control two devices in one session?

Yes, in an iOS session. agent-device can boot and control more than one iOS Simulator in a session. Use a separate named agent-device session for the second device. Pass `--session <name>` and `--device "<name>"` when you boot it. Then pass `--session <name>` on each later command for that device. The agent-device `--device` flag accepts only a device name. To select a device by its unique device identifier (UDID), use `--udid <UDID>`. See [Use a second device in the same session](https://docs.expo.dev/eas/simulators/reference/devices.md#use-a-second-device-in-the-same-session).
