Device Control
Everything you can do to the device while a session is streaming.
Connection Status
A badge above the stream reports the connection state.
| State | Meaning |
|---|---|
| Connecting | The connection is being established |
| Connected | The device is streaming |
| Disconnected | The connection dropped |
| Error | The connection failed |
While connected, the badge also carries a three-segment quality bar reading Measuring, Poor, Good, or Excellent. Opening the badge shows the live connection metrics: quality, bitrate in Mbps, packet loss, jitter, and whether control is running peer to peer or over the WebSocket.
Touch and Gestures
Interact with the stream using your mouse or trackpad.
| Input | Sent to the device |
|---|---|
| Click | A tap at that point |
| Click and drag | A swipe from the press point to the release point |
| Click and drag (Android) | A multi-point drag along the exact path you traced, when the path has enough samples |
iOS Home-Indicator Gestures
On iOS, a swipe that starts on the very bottom edge of the screen — the home-indicator strip — is treated as a system gesture rather than a swipe.
- Swipe up from the bottom edge: Home.
- Swipe from the bottom edge toward the right: App Switcher.
Both are routed through the hardware button path, which resolves the current orientation on the agent side. Start a gesture further from the edge if you want a plain swipe or scroll.
Multi-Touch
The Multi-touch control composes a multi-finger gesture, then applies it to your next interaction with the stream.
- Choose a finger count: 2, 3, or 4.
- Choose a gesture: Tap, Swipe, Pinch / Spread, or Rotate.
Selecting a gesture activates the mode immediately, and an overlay shows what to do: click the device for a tap, drag for a swipe, drag left to pinch and right to spread, or drag left or right to rotate.
Press Escape to leave the mode.
Pinch and rotate require exactly two fingers. Multi-touch cannot be used while the Inspector is enabled.
Keyboard Input
With the stream focused, your physical keyboard is sent to the device.
Space, Enter, Tab, Backspace, Delete, and the arrow keys are mapped to their device key events.
Common editing shortcuts using Ctrl or Cmd — C, X, A, Z, R, V — and the function keys are left to the browser.
Hide Keyboard in the toolbar dismisses the on-screen keyboard on the device.
A text bar below the stream sends a whole string at once, which is faster and more reliable than typing long values character by character.
Quick Paste
The Quick Paste panel is a floating clipboard for values you re-enter often.
- Type or paste a value, or pull the current value in with From Clipboard.
- Send to Device types the draft onto the device.
- Save keeps the value in the saved list, where each entry can be sent, copied back to your browser clipboard, or removed.
- Clear all empties the saved list.
The panel can be dragged anywhere over the stream.
Toolbar
The toolbar sits beside the stream.
Primary Controls
| Control | Description |
|---|---|
| Home | Presses the home button |
| Back | Presses back — Android only |
| Recent Apps | Opens the app switcher |
| Take Screenshot | Captures the current screen |
| Start / Stop Recording | Records the screen |
| Rotate | Switches between portrait and landscape, when the device supports it |
| Inspector | Toggles element inspection on the stream |
| Check accessibility | Opens the accessibility audit panel — see Accessibility |
| Multi-touch | Opens the multi-finger gesture picker |
| Quick Paste | Opens the clipboard panel |
| Install App | Installs an app on the device |
| Location Simulation | Opens the geolocation panel |
| More Tools | Opens the secondary tool group |
| App Management | Opens the app group |
| Refresh Session | Re-establishes the connection |
| End Test | Ends the session |
More Tools
| Control | Description |
|---|---|
| Volume Up / Volume Down | Presses the hardware volume keys |
| Enable / Disable Audio | Toggles device audio in the stream, where the device supports it |
| Hide Keyboard | Dismisses the on-screen keyboard |
| Shake Device | Sends a shake, where the device supports it |
When audio or shake is unavailable, the control is disabled and its tooltip explains why.
App Management
| Control | Description |
|---|---|
| View Apps | Lists the apps installed on the device |
| Kill All Apps | Force-stops running apps |
| Browse Files | Opens the device file browser |
Apps on your company's protection list are excluded from Kill All Apps. The list is maintained on the Settings page under Defaults.
Live Microphone
The microphone control streams your browser microphone to the device as PCM audio using the Web Audio API.
Select the button once to start streaming; select it again to stop. The status line reports Off, Connecting, Waiting for app mic, Ready, Sending audio, or Unavailable, and level bars show your input level while audio is being sent.
Your browser will ask for microphone permission the first time.
Platform Requirements
| Situation | What is required |
|---|---|
| Emulator, app microphone | Start microphone capture inside the target app while the status reads Waiting. The bridge waits up to ten seconds. |
| No system microphone route | Run an app built with App Toolkit instrumentation |
| iOS below 18.2 | System call audio injection is unavailable; use an App Toolkit-instrumented app or upgrade iOS |
| iOS 18.2 and later | Enable Settings › Accessibility › Audio & Visual › Add Audio in Calls on the device and allow WebDriverAgent |
On iOS 18.2 and later, audio can be added to compatible Phone, FaceTime, and VoIP calls. This is not a general system microphone, and Safari or WebRTC compatibility is not guaranteed. Regular app flows use App Toolkit instrumentation.
If the device is running a WebDriverAgent build without call audio injection, rebuild, reinstall, and restart WebDriverAgent, then retry.
Location Simulation
The location panel sets a simulated GPS position on the device.
- Map — select a point on the map and confirm with Use Location.
- Manual — enter a latitude and longitude, with an optional name, and select Set Location.
While a location is active, the panel shows Simulating and a Clear control, and a marker appears on the toolbar button. Save This Location adds the current position to the Quick Locations chips, which apply a saved position in one step. Locations you added yourself can be removed from that list.
The simulated location is cleared automatically when the session ends.
Screenshots
Take Screenshot captures the current screen into the session's Screenshots panel. From there you can preview a screenshot at full size, download it, attach it to a bug report, or delete it. Deleting asks for confirmation first.
The toolbar's recent-screenshot strip keeps the last five captures of the session; the Screenshots panel holds the full set.
Screenshot deletion is handled by the external Device Farm service. Treat it as permanent.
App Installation
Install an app in one of these ways:
- Install App in the toolbar, then pick an app from the catalog, a raw file from the repository, or a build from Firebase App Distribution.
- Drag an
.apk,.ipa, or.appbundle directly onto the stream.
A macOS .app bundle is zipped in the browser before upload; the progress indicator shows both the zipping and the upload stage.
| Target | Accepted app formats |
|---|---|
| Android | .apk, .aab |
| iOS real device | .ipa |
| iOS simulator | .app bundle, or a zipped .app |
Firebase App Distribution supplies .ipa builds for real iOS devices.
For an iOS simulator, use a simulator .app bundle or a zipped .app from the raw file list or a fresh upload.
Where an app version has an instrumented build available, you can install that build instead to enable App Toolkit hooks.
Device Files
Browse Files opens a file browser on the device, where you can navigate the file system, create folders, push a file from the repository, pull a file back, and delete files.
App Toolkit
App Toolkit hooks change how an instrumented app behaves during the session. They are baked into the installed build on Android; on iOS the toolkit is injected when the app launches for the session. Runtime toggles enable a hook while the instrumented app is running.
| Hook | What it does |
|---|---|
| Bypass screen capture restrictions | Strips FLAG_SECURE on Android and disables screen-capture detection on iOS so protected screens can be streamed and recorded |
| Mock camera input | Replaces the live camera feed with an uploaded image; required for QR code flows |
| Inject video stream | Streams a video URL as the camera input |
| Mock microphone input | Streams an audio file as the microphone source |
| App Network Capture | Mirrors HTTP traffic from inside the instrumented app |
Re-apply active hooks pushes the currently enabled hooks again, which is needed if the app process restarts.
Camera Image Capture
With Mock camera input enabled, you can supply the image the app's camera returns.
- Files picks an image already stored in the repository.
- Upload adds a new one; it is stored in Apps & Files and applied to the current session.
The control accepts JPG and PNG images up to 20 MB, and applies the image by its stored file ID. When an ML Kit barcode value is set instead, that value is returned as a synthetic barcode; the image is used when no barcode value is set, or by Camera2 frame-replace fallbacks.
Sharing a Session
The Invite control on an active session opens the sharing dialog. Three things are managed there, and they are not the same:
| Concept | What it is |
|---|---|
| Shareable link | A reusable link anyone in your company can accept |
| Invitation | A targeted invitation sent to one named coworker |
| Active viewer | Someone currently connected to the session |
Both links and invitations carry an access level:
| Level | Grants |
|---|---|
| View only | Watch the stream and the logs |
| Full control | Tap, type, and install apps |
Shareable Links
Choose an access level and select Create & copy link.
The link is of the form /devicer/session-invite/{token}.
A link expires at your company's maximum session duration and stops working when the session ends. Revoking a link only blocks new accepts; viewers who already joined must be removed from the Active viewers list.
Opening an invite link accepts it and redirects to the live session. If the link cannot be accepted the page says so and offers a way back to the session list.
Invitations and Viewers
Invite a specific coworker sends a targeted invitation with its own access level. Removing an invitation from People with access also disconnects that user from the live session. Active viewers lists everyone connected right now, and each can be removed individually.
View-Only Sessions
Some sessions stream without accepting input. The stream shows the reason:
- View-only — you were invited without control access.
- View-only — automation session is running with
df:deviceControl=false.
Set df:deviceControl to true in your automation capabilities if you want to take over an automation session by hand.
See Appium Config.
Parallel Sessions
Up to three sessions can be viewed at once. Each keeps its own toolbar, and the focused device drives the shared inspector panel.