Reference
Web testing
The same commands you use on iOS and Android, driving Playwright-managed Chromium, Firefox, or WebKit instead.
Conductor's web support lets the same commands you use on iOS and Android drive a Playwright-managed browser instead. This means an AI agent that already knows how to drive a phone can drive a web app without learning a new vocabulary.
Install the browser
Browsers aren't bundled — fetch the one you want with
install-web:
conductor install-web # default: chromium
conductor install-web firefox
conductor install-web webkit
conductor install-web --check # show install status only
Under the hood this calls
playwright-core to download the browser
binary. Once installed, the browser is reused across all subsequent
commands; you don't need to reinstall per session.
Targeting a browser
A "web device" is selected via --device:
| Device id | Browser |
|---|---|
web |
Chromium (default). |
web:chromium |
Chromium, explicit. |
web:firefox |
Firefox. |
web:webkit |
WebKit. |
web:firefox:foo |
Firefox in a sub-instance named foo. |
The third segment is an opaque sub-id Conductor uses to isolate parallel browser instances. Useful when running flows in parallel — each flow gets its own browser even if they all want Firefox.
conductor --device web open-link https://example.com
conductor --device web tap-on "Get started"
conductor --device web assert-visible "Welcome"
Attaching to an existing browser (CDP)
Instead of launching its own Playwright browser, Conductor can attach to
a browser that's already running and exposes the Chrome DevTools Protocol
over a remote-debugging port — for example an Electron app started with
--remote-debugging-port, where each window / WebContentsView is a
separate page target you may want to drive independently.
Two flags opt in (both map to the CONDUCTOR_CDP_URL /
CONDUCTOR_CDP_TARGET_ID env the daemon reads):
| Flag | Meaning |
|---|---|
--cdp-url |
The CDP endpoint to attach to (e.g. http://127.0.0.1:9222). |
--cdp-target |
Which page target to control. Required when the endpoint exposes more than one page. |
First list what's there:
conductor web-targets --cdp-url http://127.0.0.1:9222
That prints every controllable page target (id, url, title) and a
ready-to-paste bind command for each. Then bind a --device to a target
once — the attachment is persisted to that session, so later commands for
the same --device don't need the flags:
# bind (any command works; flags only needed the first time)
conductor --device web:chromium:tile1 \
--cdp-url http://127.0.0.1:9222 --cdp-target <TARGET_ID> inspect
# thereafter
conductor --device web:chromium:tile1 press-key "Remote Dpad Down"
conductor --device web:chromium:tile1 take-screenshot -o tile1.png
Use a distinct, fully-qualified --device web:<browser>:<label> per target
(the three-segment form pins a stable session; a bare web / web:chromium
gets an auto-generated sub-id instead). Each target is an independent session
with its own daemon, so several can be driven concurrently.
Notes:
- Only
type=pagetargets are controllable. A host that embeds content as a<webview>guest (type=webviewin CDP) won't surface as a Playwright page. - Conductor attaches as an additional CDP client; it coexists with any debugger the host app already has attached to the same target.
- In CDP mode Conductor never launches or closes the browser — it only
releases its handles on
daemon-stop.
What works the same as native
The mobile vocabulary translates directly:
tap-on,input-text,erase-text,press-key,back,hide-keyboard,scroll,scroll-until-visible,swipe— all drive the page the same way they drive a screen.assert-visible,assert-not-visible— same matchers, same disambiguators.inspect,focused,take-screenshot,capture-ui— same output shapes, with the DOM standing in for the native hierarchy.open-link <url>— navigates to the URL.
What's web-specific
- Element matching uses the DOM. Visible text and
aria-label/idattributes are the primary handles. The--idflag matches theidattribute; the--textflag matches visible text. set-locationtranslates to Playwright's geolocation override.set-orientationtranslates to viewport flips.- The browser instance lives as long as the daemon (or the single command, if no daemon is running). Pages persist across commands in the same session.
Running flows on the web
The same flow files you use on iOS and Android work on web:
conductor run-flow tests/login.yaml --device web
conductor run-parallel --flows-dir tests/ --devices web,web:firefox,web:webkit
Cross-platform flows can branch on ${DEVICE} if you really need to,
but most flows can stay platform-agnostic.
When to use it
- Smoke-testing a web app from inside an AI coding session — the agent edits, reloads, taps, asserts.
- Sanity checks against your local dev server before opening a PR.
- Running the same regression flows you wrote for mobile against the web build.
It's not a replacement for a full Playwright suite when you need the
expressivity of page.evaluate(...) or fine-grained network control —
but for the "drive my app like a user" loop, the mobile-shaped
commands are usually enough.