Skip to content

Commit 5dd3363

Browse files
committed
Release v1.0.9: desktop browser testing, CLI flags, banner fix
- Add CHANGELOG entry for v1.0.9 with all new features and fixes - Update README: web platform, browser CDP driver, DeviceLab driver, install specific version, web testing guide link - Bump version to 1.0.9 - Fix banner: remove Unicode box-drawing, strip OSC 8 hyperlinks in CI
1 parent 68e3567 commit 5dd3363

4 files changed

Lines changed: 58 additions & 32 deletions

File tree

CHANGELOG.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [1.0.9] - 2026-03-11
11+
1012
### Added
13+
- **Desktop browser testing** — new `--platform web` with built-in CDP driver for Chrome/Chromium. Headless by default, `--headed` for visible browser. Supports parallel browser execution
14+
```bash
15+
maestro-runner --platform web test flow.yaml
16+
maestro-runner --platform web --headed --browser chrome test flow.yaml
17+
maestro-runner --platform web test --parallel 3 flows/
18+
```
19+
- **Browser-specific commands**`evalBrowserScript`, `setCookies`, `getCookies`, `saveAuthState`, `loadAuthState`, `openTab`, `switchTab`, `closeTab`, `mockNetwork`, `blockNetwork`, `setNetworkConditions`, `waitForRequest`, `clearNetworkMocks`, `uploadFile`, `waitForDownload`, `grantPermissions`, `resetPermissions`, `getConsoleLogs`, `clearConsoleLogs`, `assertNoJSErrors`, `runBrowserScript`
20+
- **Browser selectors**`css` and `xpath` selectors for web elements, in addition to `text` and `id`
21+
```yaml
22+
- tapOn:
23+
css: "button.submit"
24+
- inputText:
25+
id: "username"
26+
text: "hello"
27+
```
28+
- `--no-app-install` flag — skip app installation even if `--app-file` is provided. Useful when the app is already installed
29+
```bash
30+
maestro-runner --no-app-install --app-file app.apk test flow.yaml
31+
```
32+
- `--no-driver-install` flag — skip driver installation (UIAutomator2, WDA, DeviceLab). Useful when drivers are already installed on the device
33+
```bash
34+
maestro-runner --no-driver-install test flow.yaml
35+
```
1136
- Flutter VM Service fallback for element finding — when the native driver (WDA/UIAutomator2) can't find a Flutter element, automatically discovers the Dart VM Service and searches the semantics/widget trees in parallel. Works on Android and iOS simulators. Non-Flutter apps pay only one log read on first miss, then fully bypassed. Disable with `--no-flutter-fallback`
1237
- Flutter widget tree cross-reference — when semantics tree search fails, falls back to widget tree analysis (hint text, identifiers, suffix icons) and cross-references with semantics nodes for coordinates
1338
- DeviceLab Android driver — WebSocket-based on-device automation with bounds stabilization for animated elements and special character handling. ~2x faster than UIAutomator2
@@ -74,6 +99,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7499
- Cloud Providers section in README with TestingBot setup guide
75100

76101
### Fixed
102+
- iOS simulator no longer requires `--team-id` — simulators don't need code signing, so the validation now only enforces `--team-id` for real devices
103+
```bash
104+
# Before: required --team-id even for simulators
105+
# Now: just works
106+
maestro-runner --platform ios --start-simulator <UDID> test flow.yaml
107+
```
77108
- `runFlow: when` conditions with variable expressions (e.g., `${output.element.id}`) were never expanded, causing conditions to always evaluate as false and silently skip conditional blocks
78109
- iOS real device: `acceptAlertButtonSelector` matched "Don't Allow" instead of "Allow" — `CONTAINS[c] 'Allow'` matched both buttons, causing WDA to reject permission dialogs. Changed to `BEGINSWITH[c] 'Allow'` with `OK` fallback for older iOS versions
79110
- `AllocatePort` was ignoring existing port allocations and `assertCondition` had duplicate `timeout` yaml tag

README.md

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44

55
---
66

7-
**Fast mobile UI test automation for Android, iOS, React Native, Flutter & Expo**
7+
**Fast UI test automation for Android, iOS, Web, React Native, Flutter & Expo**
88
<br>
99
*Open-source Maestro alternative — single binary, no JVM. 100% free, no features behind a paywall.*
1010
<br>
11-
*Supports real iOS devices, simulators, emulators, and cloud providers.*
11+
*Supports real iOS devices, simulators, emulators, desktop browsers, and cloud providers.*
1212

1313
![3.6x faster](https://img.shields.io/badge/3.6x_faster-3a9d5c?style=for-the-badge) ![14x less memory](https://img.shields.io/badge/14x_less_memory-3a9d5c?style=for-the-badge)
1414

@@ -25,22 +25,26 @@
2525

2626
---
2727

28-
- Runs Maestro YAML flows on real devices, emulators, and simulators
29-
- Supports Android (UIAutomator2), iOS (WebDriverAgent), and cloud (Appium)
28+
- Runs Maestro YAML flows on real devices, emulators, simulators, and desktop browsers
29+
- Supports Android (UIAutomator2), iOS (WebDriverAgent), Web (Chrome CDP), and cloud (Appium)
3030
- Built-in parallel execution, HTML/JUnit/Allure reports, and JavaScript scripting
3131
- Addresses [78% of the top 100 most-discussed open issues](docs/maestro-issues-analysis.md) on Maestro's GitHub
3232

3333
## Install
3434

3535
```bash
3636
curl -fsSL https://open.devicelab.dev/install/maestro-runner | bash
37+
38+
# Install a specific version
39+
curl -fsSL https://open.devicelab.dev/install/maestro-runner | bash -s -- --version 1.0.9
3740
```
3841

3942
## Run Tests
4043

4144
```bash
4245
maestro-runner test flow.yaml # Android (default)
4346
maestro-runner --platform ios test flow.yaml # iOS
47+
maestro-runner --platform web test flow.yaml # Desktop browser (Chrome)
4448
maestro-runner --app-file app.apk test flows/ # Install app and run
4549
maestro-runner --driver appium --appium-url <server-url> test flow.yaml # Appium
4650
maestro-runner test --parallel 3 flows/ # Parallel on 3 devices
@@ -51,6 +55,7 @@ maestro-runner test --parallel 3 flows/ # Parall
5155
- **Zero migration** — Runs your existing Maestro YAML flows as-is, no changes needed
5256
- **Real iOS device testing** — Supports physical iOS devices, not just simulators [Guide →](https://devicelab.dev/blog/maestro-ios-real-device-testing)
5357
- **Cloud testing** — BrowserStack, Sauce Labs, LambdaTest, TestingBot via Appium driver [Guide →](https://devicelab.dev/blog/run-maestro-flows-any-cloud)
58+
- **Desktop browser testing** — Run Maestro flows on Chrome/Chromium via CDP. Supports `css`, `xpath`, `id`, and `text` selectors with `--platform web` [Guide →](https://devicelab.dev/open-source/maestro-runner/docs/web-testing)
5459
- **React Native & Flutter** — Smart element finding for RN testIDs and Flutter semantics [Guide →](https://devicelab.dev/blog/flutter-testing-maestro-patrol-appium)
5560
- **DeviceLab driver** — Optional on-device Android driver via WebSocket, ~2x faster than UIAutomator2 and ~5x faster than Maestro CLI. Just add `--driver devicelab`
5661
- **Parallel execution** — Dynamic work distribution across devices, not static sharding. Faster devices pick up more tests automatically, so no device sits idle
@@ -72,7 +77,9 @@ maestro-runner test --parallel 3 flows/ # Parall
7277
| Driver | Platform | Description |
7378
|--------|----------|-------------|
7479
| **UIAutomator2** | Android | Direct connection to device. Default driver, no external server needed. |
80+
| **DeviceLab** | Android | `--driver devicelab`. On-device WebSocket driver, ~2x faster than UIAutomator2. |
7581
| **WDA (WebDriverAgent)** | iOS | Auto-selected with `--platform ios`. Supports simulators and physical devices. |
82+
| **Browser (CDP)** | Web | `--platform web`. Chrome/Chromium automation via Chrome DevTools Protocol. |
7683
| **Appium** | Android & iOS | `--driver appium`. For cloud testing providers and existing Appium infrastructure. |
7784

7885
### DeviceLab Driver (Android)
@@ -119,6 +126,7 @@ waitForIdleTimeout: 3000 # Device idle wait (ms), 0 to disable
119126
120127
- **Android testing:** `adb` (Android SDK Platform-Tools)
121128
- **iOS testing:** Xcode command-line tools (`xcrun`)
129+
- **Web/Browser testing:** Chrome or Chromium
122130
- **Cloud & Appium testing:** Appium 2.x or 3.x — works with local Appium servers and cloud providers (BrowserStack, Sauce Labs, LambdaTest, TestingBot)
123131

124132
## Cloud Providers

pkg/cli/cli.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111

1212
// Build info — set at build time via -ldflags.
1313
var (
14-
Version = "1.0.1"
14+
Version = "1.0.9"
1515
Commit = "unknown"
1616
BuildDate = "unknown"
1717
)

pkg/cli/test.go

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -474,42 +474,29 @@ type RunConfig struct {
474474
NoFlutterFallback bool // Disable automatic Flutter VM Service fallback
475475
}
476476

477-
func printBanner() {
478-
// Make DeviceLab.dev clickable and colored (cyan)
479-
// OSC 8 hyperlink format: ESC]8;;URL BEL TEXT ESC]8;; BEL
480-
deviceLabLink := "\x1b]8;;https://devicelab.dev\x07" + color(colorCyan) + "DeviceLab.dev" + color(colorReset) + "\x1b]8;;\x07"
481-
482-
// Make GitHub link clickable
483-
githubLink := "\x1b]8;;https://github.com/devicelab-dev/maestro-runner\x07Star us on GitHub\x1b]8;;\x07"
484-
485-
// Box width is 64 characters (between the ║ symbols)
486-
// Calculate padding for version line
487-
// Visible text: " maestro-runner " + Version + " - by DeviceLab.dev"
488-
versionLineVisible := 16 + len(Version) + 20 // " maestro-runner " + version + " - by DeviceLab.dev"
489-
versionPadding := strings.Repeat(" ", 64-versionLineVisible)
477+
func hyperlink(url, text string) string {
478+
if colorsEnabled {
479+
return "\x1b]8;;" + url + "\x07" + text + "\x1b]8;;\x07"
480+
}
481+
return text
482+
}
490483

491-
// Calculate padding for GitHub line
492-
// Visible text: " ⭐ Star us on GitHub"
493-
githubLineVisible := 21 // " ⭐ " + "Star us on GitHub" (⭐ is 3 bytes but 1 visual char)
494-
githubPadding := strings.Repeat(" ", 64-githubLineVisible)
484+
func printBanner() {
485+
deviceLabLink := hyperlink("https://devicelab.dev", color(colorCyan)+"DeviceLab.dev"+color(colorReset))
486+
githubLink := hyperlink("https://github.com/devicelab-dev/maestro-runner", "Star us on GitHub")
495487

496488
fmt.Println()
497-
fmt.Println("╔═══════════════════════════════════════════════════════════════════╗")
498-
fmt.Printf("║ maestro-runner %s - by %s%s ║\n", Version, deviceLabLink, versionPadding)
499-
fmt.Println("║ Fast, lightweight Maestro test runner ║")
500-
fmt.Printf("║ ⭐ %s%s ║\n", githubLink, githubPadding)
501-
fmt.Println("╚═══════════════════════════════════════════════════════════════════╝")
489+
fmt.Printf(" maestro-runner %s - by %s\n", Version, deviceLabLink)
490+
fmt.Println(" Fast, lightweight Maestro test runner")
491+
fmt.Printf(" %s\n", githubLink)
502492
fmt.Println()
503493
}
504494

505495
func printFooter() {
506-
// Make DeviceLab.dev clickable and colored (cyan)
507-
deviceLabLink := "\x1b]8;;https://devicelab.dev\x07" + color(colorCyan) + "DeviceLab.dev" + color(colorReset) + "\x1b]8;;\x07"
496+
deviceLabLink := hyperlink("https://devicelab.dev", color(colorCyan)+"DeviceLab.dev"+color(colorReset))
508497

509498
fmt.Println()
510-
fmt.Println("╔══════════════════════════════════════════════════════════════════════════╗")
511-
fmt.Printf("║ Built by %s - Turn Your Devices Into a Distributed Device Lab ║\n", deviceLabLink)
512-
fmt.Println("╚══════════════════════════════════════════════════════════════════════════╝")
499+
fmt.Printf(" Built by %s - Turn Your Devices Into a Distributed Device Lab\n", deviceLabLink)
513500
fmt.Println()
514501
}
515502

0 commit comments

Comments
 (0)