Changelog
[0.0.64] (2026-10-05)
- Feat: add
locator.check(),uncheck()andsetChecked()with Playwright semantics (#379) - Feat(driver-mobilenext): install apps before allocating a cloud device (#389)
- Feat(iOS): drive Safari tabs with the webview commands, on real devices and simulators (mobilecli#490)
- Feat(Android): drive Chrome tabs with the webview commands over CDP (mobilecli#489)
- Fix: round
doubleTapandlongPresscoordinates before sending to mobilecli (#364) - Fix(cli):
doctorno longer reports Android devices as missing an agent (#381) - Fix(cli):
doctorgives Linux advice, skips local SDK checks behind a remote ADB server, and no longer fails on Hyper-V or AEHD setups (#384) - Fix: match log filters case-insensitively, message as a substring (mobilecli#483)
- Fix: accept hardware button names case-insensitively (mobilecli#479)
- Fix(iOS): reset privacy permissions when clearing an app on a simulator (mobilecli#486)
- Fix(iOS): terminating an app on a simulator reports "process not found" or "not installed" instead of a simctl exit status (mobilecli#493)
- Fix(iOS): list only the simulator's own crash reports, not the host's (mobilecli#482)
- Fix(Android): keep the device in touch mode while typing text (mobilecli#492)
- Fix(Android): report a webview behind another screen as not visible (mobilecli#488)
- Chore: upgrade bundled mobilecli to 1.0.18 (#388)
[0.0.63] (2026-10-01)
- Feat(driver-mobilenext):
apiKeydefaults to theMOBILENEXT_API_KEYenvironment variable (#359) - Feat(iOS): listen on multiple addresses, including IPv6, in
DEVICEKIT_LISTEN_HOST(devicekit-ios#92), thanks to @hillct - Fix: webview
expect()keeps polling when the element is not in the DOM yet (#358) - Fix: no more orphan mobilecli server, signals are forwarded to the binary (mobilecli#475)
- Fix(iOS): webview evaluate no longer crashes the app on a non-JSON result (mobilecli#473)
- Fix(iOS): report the unfolded screen size on foldable simulators (devicekit-ios#91)
- Fix(iOS): landscape screenshots are rotated in the pixels, not with an EXIF tag (devicekit-ios#93)
- Fix(iOS): fail the test run when the agent server can't start (devicekit-ios#94)
- Fix(iOS): resolve symlinks before the simulator file system sandbox check (mobilecli#477)
- Fix(Android): keep the whole URL when opening it, values after
&were missing (mobilecli#472) - Fix(Android): stop the device server when idle or when the daemon exits, freeing uiautomator (mobilecli#476)
- Fix(Android): quote package names passed to adb shell (mobilecli#471)
- Chore: upgrade bundled mobilecli to 1.0.17 (#362)
[0.0.62] (2026-09-29)
- Feat: add
device.setFoldState()to fold and unfold foldable iOS simulators and Android emulators, by state or hinge angle (#354) - Feat(Flutter):
getByTestId()matches widget keys such asKey('login-button')in debug builds (#353) - Feat(codegen): record open URL and fill actions, and show failed actions in a toast (#349)
- Feat: slider, text field and switch state is reported consistently on Android and iOS (mobilecli#455)
- Fix(iOS): tap, swipe, gestures, screenshots and view tree frames on folded and unfolded foldable simulators (devicekit-ios#82, devicekit-ios#88, devicekit-ios#89)
- Fix(iOS): tap and swipe coordinates are mapped correctly in landscape (devicekit-ios#83), thanks to @hakanor
- Fix(iOS): view tree frames are no longer offset when the app is rotated to landscape (devicekit-ios#86)
- Fix(iOS): background the test runner on iOS 27 simulators (devicekit-ios#84)
- Chore: upgrade bundled mobilecli to 1.0.16 (#353, #355)
[0.0.61] (2026-09-26)
- Feat: add
mobilewright codegen, a browser UI that records taps and assertions on a live device screenshot into a test (#346) - Feat:
autoAppLaunchterminates the app before launching it in the standalone launcher, matching the test fixture (#347) - Fix(Android):
getByTestId()matches short resource-ids such aspassword_field, not onlycom.example.app:id/password_field(#344) - Fix: plain-value
expect()assertions are reported as a step in the reporter (#340), thanks to @marcomaes - Docs: mark Flutter as supported (#336)
[0.0.60] (2026-09-21)
- Feat:
getByRole()acceptsprogressbar,alertandcombobox(#332) - Feat:
Roletype is exported frommobilewrightand@mobilewright/test(#333) - Feat(inspector): suggest a role locator when duplicate test IDs have unique roles (#330)
- Feat(inspector): resizable panes, arrow-key row navigation, sticky raw attributes and favicon (#329)
- Feat(iOS): slider, picker, alert, list, tab, link and navigation bar elements are returned in the view tree, so
getByRole()can match them (mobilecli#440) - Fix: honour
DO_NOT_TRACKand require Node.js >= 22.12.0 in every package (#326) - Fix(doctor): stop suggesting a nonexistent
JAVA_HOMEpath on Windows (#325) - Fix(Android): the view tree is no longer stale after fast content changes, such as a Compose
LazyRowloading its items (mobilecli#439) - Fix(Android): screen capture works on Android 12 and 13 (mobilecli#435)
- Fix(Android): apps and urls launch on the default display (mobilecli#442)
- Chore: upgrade bundled mobilecli to 1.0.13 (#331, #334)
- Docs: add Windows setup page (#323)
[0.0.59] (2026-09-16)
- Feat: add
@mobilewright/cli, a token-efficient agent CLI for driving devices (#307) - Feat: CLI prints Mobilewright code after every action, adds agent skill, apps, logs, video and element screenshots (#308)
- Feat: report test runs as running while they execute (#312)
- Feat: forward
onTestBegin,onStdOut,onStdErrandonErrorto driverTestObserver(#311) - Fix: queue workers on cloud concurrency limit instead of failing tests (#310)
- Fix: log why device allocation silently waits when no device matches (#313)
- Fix: throw clear error in
screenfixture when device setup did not complete (#314) - Fix: flatten
screen.gesture()pointers for mobilecli gestures (#305) - Fix: fail fast when no device can match the allocation criteria (#309), thanks to @rahul-system
- Fix: keep device allocation alive during slow app uploads (#315)
- Fix: address review comments on the agent CLI (#316)
- Fix: catch synchronous errors in the upload keepalive timer (#317)
- Chore: require Node.js >= 22.12, now tested in CI (#303, #319)
- Chore: upgrade bundled mobilecli to 1.0.11 (#318)
- Perf(Android): tap, long press, swipe, button, keys and text go through the embedded agent instead of
adb shell input(mobilecli#412), thanks to @akexorcist - Perf(iOS): stop tearing down and relaunching the agent on every call (mobilecli#406), thanks to @bjjeong
- Fix(iOS): restore iOS 14 support (devicekit-ios#75, devicekit-ios#76), thanks to @hakanor
- Fix(Android): report the real app name for the foreground app, including on devices with more than one display (mobilecli#403, mobilecli#423), thanks to @akexorcist
- Fix: don't hang on a locked keyring when reading credentials (mobilecli#408), thanks to @EnglandLobster
- Docs: add TestingBot cloud provider page (#306)
[0.0.58] (2026-09-10)
- Feat: add
expect.softfor non-fatal assertions (#300) - Feat: send scarf.sh pixel on
mobilewright testwhen telemetry is enabled (#301) - Fix: upgrade playwright to 1.63.0 and adapt to internal runner API changes (#299), thanks to @marcomaes
[0.0.57] (2026-09-08)
- Chore: upgrade bundled mobilecli to 1.0.9, the Android on-screen keyboard is no longer returned by
getViewTree(#295) - Chore: upgrade playwright to 1.62.1 (#274), thanks to @marcomaes
- Docs: add geolocation guide (#296)
[0.0.56] (2026-09-06)
- Feat: add
device.setGeolocationfor overriding the device GPS location (#279) - Chore: upgrade bundled mobilecli to 1.0.8 and use clip for element screenshots, remove sharp package (#289, #290)
- Chore: require Node.js >= 20.19 (#291)
- Docs: add Requirements and
doctorcheck to Installation, correct the scaffold walkthrough (#292) - Docs: add Cloud Providers section with Mobile Next Cloud and BrowserStack guides (#285)
- Docs: fix typos and update docs (#287), thanks to @eilinwis
[0.0.55] (2026-09-01)
- Fix: resolve mobilecli binary from its per-platform optional dependency instead of
mobilecli/bin, and support win32-arm64 (#282)
[0.0.54] (2026-09-01)
- Feat: add radio role mapping to query engine (#277)
- Chore: update bundled mobilecli to 1.0.7 — npm package split into per-platform binaries, shrinking
node_modulesby ~70MB (#276, mobilecli#134) - Fix(iOS): don't fail device listing when one connected device is untrusted (mobilecli#373)
- Feat(iOS): surface enabled, selected and focused attributes in UI dumps (mobilecli#369)
- Perf(Android): faster screenshots via on-device agent (mobilecli#368)
[0.0.53] (2026-08-13)
- Feat: filter device allocation by
deviceType(simulator/emulator/real) andosVersionconstraint expressions like"17"or">=17 <19"(#269) - Feat: accept driver instances instead of
{ type, ... }config objects — passnew MobileNextDriver({ apiKey })(#260) - Feat: send mobilewright User-Agent header on fleet API requests (#263)
- Refactor: split driver interface into DeviceAllocator/MobilewrightSession, drop auto-reporter wiring (#267)
[0.0.52] (2026-08-01)
- Feat: add per-project
deviceIdand expose the resolveddevice.id(#257) - Feat(driver-mobilecli): surface selected, checked, and focused state from UI dumps (#252, mobilecli#320), thanks to @sjy
- Fix(Android): map
ToggleButtonelements to theswitchrole (#256) - Perf(driver-mobilecli): check agent status once per device instead of once per test (#251)
- Chore: update bundled mobilecli to 1.0.0 (#258)
- Fix(iOS): select the correct certificate for the given provisioning profile (mobilecli#325)
- Fix(iOS): correct UI element positions inside nested windows (mobilecli#321)
- Fix(iOS): restore Xcode 26.5 testing and simulator agent version checks and upgrades (mobilecli#324)
- Fix(Android): prevent device detection from hanging when
adbdneeds a 'kill-server' (mobilecli#322)
[0.0.51] (2026-07-29)
- Feat(expect): support a custom message argument, like Playwright (#241)
- Fix(core): match Android fully-qualified widget types in getByRole and export the Role type (#186), thanks to @Dhakshath11
- Fix(web-locator): coerce a non-boolean injected verdict so expect() fails cleanly (#243)
- Refactor(inspector): share core's role map and type normalization, so role suggestions match getByRole on Android (#244)
- Chore: update mobilecli to 0.3.88 which fixes app installation timeouts over jsonrpc
[0.0.50] (2026-07-15)
- Feat(driver-mobilenext): allocate devices via the sessions REST API (#228)
- Feat(inspector): add element attributes in sidebar (#227), thanks to @sarang-code2
- Fix(inspector): per-op timeouts + partial retry to prevent mobilecli worker pool deadlock (#229), thanks to @sarang-code2
- Fix: resolve fully-qualified native types in getByRole (#196)
- Fix(test): merge project-level use into config for actionTimeout and other options (#227), thanks to @sarang-code2
[0.0.49] (2026-07-11)
- Fix(driver): do not fall back to accessibility name for testId identifier (#224)
[0.0.48] (2026-07-01)
- Fix(ci): fixed publishing of @mobilewright/inspector
- Fix(ci): run "npm publish --dry-run" on all packages prior to publishing any
[0.0.47] (2026-06-30)
- Feat: add mobilewright inspect command with browser-based element inspector (#213), thanks to @marcomaes
[0.0.46] (2026-06-17)
- Feat: device-level settings with animations toggle (#201)
- Chore: update bundled mobilecli to 0.3.85 (#203)
[0.0.45] (2026-06-15)
- Feat(Locator):
locator.clear()empties a text field, andfill()now auto-clears before typing (#195) - Feat(Agent): automatically update the agent on
installwhen versions differ - Feat(Android): add placeholder field to Android
dump ui - Fix(Android): restore missing Android EditText if it had no value, no hint, no id (but was clickable)
- Feat: return installed app metadata from
apps install - Feat(Android): Android
list appsnow includes version and versionCode - Fix: scale press-keys RPC timeout by key count
- Fix(iOS): match agent bundle id by suffix to support re-signed runner
- Chore: update npm packages for security (#193)
- Chore: update bundled mobilecli to 0.3.84 (#199)
[0.0.44] (2026-06-12)
- Feat: add
activitytoLaunchOptions(#182) - Feat(driver-mobilenext): upload test report by default unless
uploadReportis off (#188) - Feat(driver-mobilenext): log periodic progress during app upload to S3 (#187)
[0.0.43] (2026-06-12)
- Feat: add
device.screenSize()returning width, height, scale (#179) - Feat: expose
doubleTap(),longPress(),gesture()on Screen (#178) - Feat: add
filter(),and(),or()to Locator (#177) - Fix: added missing webview types (#183)
[0.0.42] (2026-06-09)
- Feat: adding Playwright webview support with
getByWebView()locator (#172) - Feat: test result upload to mobilenext.ai (#147)
- Feat: Playwright-idiomatic timeout configuration (#155)
- Feat: collect code snippets from each test step for mobilenext report (#157)
- Feat: additional debug logs around mobilenext test report upload (#161)
[0.0.41] (2026-05-26)
- Refactor: rename
mobile-usedriver tomobilenext(#146) - Chore(driver-mobilecli): update mobilecli to fix websocket 1006 errors (#150)
[0.0.39] (2026-05-21)
- Feat: add test step instrumentation for HTML reporter (#144)
- Feat: add Dockerfile for mobilewright image, multi-arch for arm64 and amd64 (#143)
- Fix(locator):
isVisible()no longer swallows driver/session errors — only returnsfalsefor element-not-found failures, rethrows all other errors (#138), thanks to @JustasMonkev
[0.0.38] (2026-05-17)
- Fix(ios): call
getForegroundApp()beforelaunchApp()in mobilecli driver to ensure DeviceKit is running first, preventing a race where its startup minimizes the newly-launched app (#89) - Fix(android): using instruments to get view tree, solves bug when constant UI change would fail "uiautomator dump" (fix is in mobilecli 0.3.74)
- General: skip redundant
mobilecli devicesshell-outs inconnect()andinstallApp()when device type is already known, reducing test startup time by ~4s - General: break early if installApps points to non-zip containers, before allocating devices
- General: added plenty of verbose logs when
DEBUG=mw:*
[0.0.37] (2026-05-16)
- Feat: add installApps to per-project overrides (#133)
- Feat: export HardwareButton from @mobilewright/core and add LOCK button (#132)
- Fix: use Number.NaN and String.raw in tests (#93), thanks to @khanhdodang
[0.0.36] (2026-05-16)
- Feat: add toHaveCount and toBeEmpty assertions (#122), thanks to @alexC2K
- Feat: add device info annotations to test report (#125)
- Feat(test): attach accessibility tree on test failure via saveTreeOnFailure (#111), thanks to @farhanlabib
- Feat: add eslint with @typescript-eslint and @stylistic rules (#127)
- Fix(driver): reject .ipa installs on iOS simulators with a clear error (#74), thanks to @krismuhi
- Fix: only catch LocatorError in expect assertions, rethrow unexpected errors (#126)
- Fix: respect autoAppLaunch config option in test fixture (#110), thanks to @farhanlabib
[0.0.35] (2026-05-12)
- Fix(android): updated mobilecli to 0.3.73 to fix missing elements that had non-null resource-id (#120)
[0.0.34] (2026-05-12)
- Feat(locator):
locator.exists()is now available — returnstrueif the element is present in the view tree - Fix:
--configflag is now correctly honored in fixtures and device-pool setup (#109) - Fix(android): moved away from monkey to run apps, fixes apks compiled with 'test' flag
[0.0.33] (2026-05-07)
- Fix(android): warn and continue when foreground app check fails on launch instead of throwing error, thanks @farhanlabib (#102)
[0.0.32] (2026-05-05)
- Fix: updated mobilecli to fix 'SYS_KEYS has no physical keys but with factor 2.0%' error on certain Android devices
[0.0.31] (2026-05-04)
- Feat:
screen.getByPlaceholder()is now available (#84) - Feat:
launchApp()now waits for the app to reach the foreground before continuing; passnoWaitAfter: trueto skip (#80) - Feat: Add anonymous telemetry for
test,doctor, andinitcommands - see README for opt-out (#79) - Feat:
initexample test template now includes adeviceparam and doc comments (#86) - Fix: mobilewright --version now reads from
package.jsoninstead of the hardcoded'0.0.1'(#78)
[0.0.30] (2026-05-01)
- Fix(config):
loadConfig()now usespathToFileURLfor dynamic import — fixes config not loading on Windows - Fix(doctor): Suggest
Microsoft.OpenJDK.17instead of Azul Zulu for Windows JDK installs - Feat(test):
swipeon a locator — e.g. swipe left on a list item - Docs: Added Windows instructions for enabling debug logs (
$env:DEBUG/set DEBUG)
[0.0.29] (2026-04-30)
- General: mobilecli agent is automatically installed on simulators and emulators at connect time — no manual
mobilewright installstep needed - Fix(cli):
npx mobilewright initnow works correctly — templates were missing from the published dist - Fix(driver-mobilecli): Windows 11 is now supported —
win32-x64resolves tomobilecli-windows-amd64.exe
[0.0.28] (2026-04-29)
- Fix(test): Stream cloud recordings to disk instead of loading into memory — safe for large video files
- Fix(test): Video attachments now work with the cloud drivers
- Fix(cli): Fixed HTML report branding so it now applies when the
htmlreporter is configured
[0.0.27] (2026-04-28)
- General: New worker/device-pool architecture: workers acquire devices from a shared pool instead of each worker owning a dedicated device
- General: Track installed apps per slot to skip re-install when the same worker reuses a device
- General: Per-allocation timeouts via
AbortSignal; pool shutdown drains waiters and releases all slots - General: Stack traces from
expect()failures now omit mobilewright frames — setMWDEBUGIMPL=1to see them - General: Upgrade mobilecli to
0.3.67 - CLI: Add
--shardoption to thetestcommand for multi-host sharding of tests - CLI: Add
mobilewright merge-reportscommand, needed for sharding - Fix: Fix 'text' field from viewTree to fetch from dump's 'text' instead of 'label', thanks to emor
- Fix(allocator-factory): Throw on unknown driver type instead of silently falling back to mobile-use
- Fix(driver-mobile-use): Only call
fleet.releaseon disconnect when this instance owns the lease - Fix(device-pool): Re-queue waiters on
NoDeviceAvailableError; treatNaN--workersas 1 - Fix(rpc-client): Close WebSocket nicely with code 1000 and await the close handshake on
disconnect()
[0.0.26] (2026-04-22)
- Fix(driver-mobile-use): Device allocation now correctly waits for provisioning to complete
- Fix(driver-mobile-use):
devices.listresponse properly unwrapped from{ devices: [...] }envelope - Fix(driver-mobile-use):
installAppupload now includesduplex: 'half'required by Node.js for stream bodies
[0.0.25] (2026-04-22)
- General: Add
installAppsconfig option to install apps before launching - General: Add
autoAppLaunchconfig option to skip automatic app launch (default:true) - Fix:
loadConfig()now unwraps double-wrapped default exports caused by Playwright's transpiler - Fix(driver-mobile-use): Handle
allocatingstate from mobile-use.com, wait until device is ready - Fix(driver-mobile-use):
installAppuploads file viauploads.create
[0.0.24] (2026-04-22)
- General: Add
@mobilewright/driver-mobile-usepackage for mobile-use.com cloud device support - General: Refactor
ConnectionConfig— replace requireddeviceIdwith requiredplatform, optionaldeviceId,deviceName,osVersion - General: Move device resolution into drivers — mobilecli resolves locally
- General: Add missing
scalefield to getScreenSize response - General: Default
workers: 1indefineConfig— mobile tests target a single device, changeable for cloud - General: Add
debuglogging to both drivers (DEBUG=mw:*to enable) - General: Improve WebSocket error messages with close code and reason
- General: Add
toMatch,toBeInstanceOf,toBeDefined,toBeGreaterThanOrEqual,toBeLessThanOrEqual,toBeNaN,toContainEqual,toHaveLength,toHaveProperty,toMatchObject,toStrictEqual,toThrowassertions - General: Handle both flat array and
{ apps: [...] }response inlistApps, thanks to emor - Docs: Add troubleshooting guide with
DEBUG=mw:*andmobilewright doctorusage - Tests: Add cross-driver integration test suite (
e2e/) - Fix:
LaunchOptions.localerenamed tolocales(to match mobilecli server protocol) - Fix:
gesture()now sendsactionsparam to match OpenRPC spec (was incorrectly sendingpointers) - Fix:
startRecordingno longer dropstimeLimit: 0 - Fix:
disconnect()now properly awaits WebSocket close
[0.0.22] (2026-04-16)
- General: Add
mobilewright installcommand to install agents on devices (#29) - General: Switch
listDevices()to use mobilecli cli instead of launching server (#29) - General: Upgrade mobilecli to
mobilecli@0.3.66(#29) - Doctor: Show mobilecli version and detected devices with agent install status (#30)
- Doctor: Show booted iOS simulators with UDIDs (#30)
- Doctor: Remove Homebrew check (#30)
- CI: Add explicit permissions to docs build workflow (#28)
[0.0.21] (2026-04-14)
- General: Support plain value assertions in
expect()—toBe,toEqual,toBeTruthy,toBeFalsy,toContain,toMatch, and more (#17) - CI: Add explicit permissions and
npm auditto CI workflow (#19) - CI: Use
npm ciinstead ofnpm installand add CODEOWNERS (#20)
[0.0.20] (2026-04-13)
- General: Add
count(),all(),first(),last(),nth()to Locator for collection operations (#10) - General: Add
screen.goBack()convenience method for Android (#11) - General: Add
toBeHidden()assertion (#11) - General: Rename
toHaveFocus()totoBeFocused()for naming consistency (#11) - General: Copy README into mobilewright package before npm publish (#14)
[0.0.19] (2026-04-13)
- General: Add
screen.viewTree()to dump the UI view hierarchy (#12) - General: Add
mobilewright screenshotCLI command (#9) - General: Update mobilecli to 0.1.64
[0.0.18] (2026-04-02)
- General: Fix mobilecli binary resolution using
createRequireto work reliably from npx caches, global installs, and local node_modules (#7)
[0.0.17] (2026-04-02)
- General: Add
mobilewright initcommand to scaffold config and example test (#2) - General: Improve html test report template with click-to-fullscreen screenshots (#6)
- General: Add
getByPlaceholderlocator for matching elements by placeholder text (#4) - General: Add
toBeDisabled,toBeSelected,toHaveFocus,toBeChecked, andtoHaveValueassertions (#4) - General: Add
isSelected,isFocused,isChecked, andgetValuelocator queries (#4) - General: Support
testIdmatching against full AndroidresourceIdfor Appium migration (#4) - General: Fix swipe command to convert direction to start/end coordinates for mobilecli RPC (#5)
- Android: Map React Native view types (ReactViewGroup, ReactTextView, ReactEditText, ReactImageView, ReactScrollView) to semantic roles (#4)
- Android: Parse
isCheckedstate from UI hierarchy (#4)
Was this page helpful?