Repository navigation
chore: rebase beta onto master - #3110
mykola-mokhnach wants to merge 109 commits into
Conversation
## [12.13.2](v12.13.1...v12.13.2) (2026-09-23) ### Bug Fixes * grepFile error handling ([#2989](#2989)) ([79b387b](79b387b))
## [12.13.3](v12.13.2...v12.13.3) (2026-09-28) ### Bug Fixes * bump WDA for package creation with Xcode 26+ ([#2996](#2996)) ([b9750ba](b9750ba))
…reference for Device Hub (#2999)
## [12.14.0](v12.13.3...v12.14.0) (2026-10-03) ### Features * support simulatorPasteboardAutomaticSync and connect hardware preference for Device Hub ([#2999](#2999)) ([3cda6b2](3cda6b2))
## [12.14.1](v12.14.0...v12.14.1) (2026-10-03) ### Bug Fixes * merge tunnel and legacy device discovery ([#2991](#2991)) ([77b451f](77b451f))
* feat: partial support Duo * bump the appium-ios-simulator
## [12.15.0](v12.14.1...v12.15.0) (2026-10-03) ### Features * support launching WDA on Duo ([#3000](#3000)) ([a097de0](a097de0))
* fix: apply MJPEG orientation before converting screenshots * fix: make MJPEG screenshot orientation correction opt-in * test: import MJPEG metadata type explicitly
* fix: preserve app iframe selection after native tap calibration * fix: serialize native web tap atom requests * style: format native web tap regression tests * style: apply repository formatter configuration
## [12.15.2](v12.15.1...v12.15.2) (2026-10-07) ### Bug Fixes * preserve app iframe selection after native tap calibration ([#3015](#3015)) ([9de5422](9de5422))
* fix: refresh display geometry for viewport screenshots * bump wda * fix: return best-effort screenshot for invalid crop geometry * fix: reject negative fractional viewport crop heights
* feat: add simulated Duo hinge angle command * update docs and add get * remove js code example * fix: delegate hinge platform support checks to WDA * fix: delegate hinge angle validation to WDA
…DA (#3017) mobile selectPickerWheelValue ignored value and maxAttempts. docs/reference/execute-methods.md documents both, and mobileSelectPickerWheelValue in lib/commands/gesture.ts forwards both to WDA /wda/pickerwheel/<id>/select. But the entry in lib/execute-method-map.ts only listed offset as optional, so BaseDriver logged value and maxAttempts as unknown and dropped them before the call. WDA then moved the wheel by one step and didn't scroll to the requested value. I added value and maxAttempts to the optional params of the map entry and a unit test in test/unit/commands/gesture.spec.ts that expects both to reach proxyCommand. A sweep of all 117 executeMethodMap entries against their command signatures found no other missing or misordered parameter. Tests I ran $ npm run build, then the node test runner on build/test/unit/commands/gesture.spec.js (execute-method-map.ts from master f528f59) info BaseDriver The following arguments are not known and will be ignored: value,maxAttempts Error [ExpectationError]: Unexpected call: proxyCommand('/wda/pickerwheel/4/select', 'POST', { order: 'next' }) 1 failed $ npm test (this branch) tests 569, pass 569, fail 0 $ npm run lint exit 0 $ npm run format:check exit 0 End to end, XCUITestDriver.execute() from build/lib with its WDA proxy pointed at a local fake WDA server master POST /session/wda1/wda/pickerwheel/abc-4/select {"order":"next"} branch POST /session/wda1/wda/pickerwheel/abc-4/select {"order":"next","value":"March","maxAttempts":50} The e2e suites didn't run, since they need Xcode, a booted simulator and a built WebDriverAgent.
## [12.16.1](v12.16.0...v12.16.1) (2026-10-10) ### Bug Fixes * pass value and maxAttempts of mobile selectPickerWheelValue to WDA ([#3017](#3017)) ([ba9e634](ba9e634))
… support (#3013) * feat: add mobile: getScreens and document the currentDisplayId setting * fix: bypass stale MJPEG frames after display selection changes * docs: add duo tutorial * adjust version * follow uia2 format as possible * docs as well * simplified * add x, y and trains * fix typo, tsets * fix typo * do not address simctl * do not address simctl * review * review --------- Co-authored-by: Jason Steinberg <j.steinberg702@gmail.com>
## [12.17.0](v12.16.1...v12.17.0) (2026-10-10) ### Features * add multi-display discovery and safe screenshot routing for Duo support ([#3013](#3013)) ([0fac1ec](0fac1ec))
* fix: preserve recording aspect ratio and input frame rate * fix: tolerate recording canvas probe failures * fix: preserve recording geometry entirely in ffmpeg * docs: explain ffmpeg-only recording performance rationale * docs: describe Duo simulator XCTest recording limitation * shorten * chore: shorten screen recording comments
## [12.17.1](v12.17.0...v12.17.1) (2026-10-10) ### Bug Fixes * preserve recording aspect ratio and input frame rate ([#3010](#3010)) ([caabeb3](caabeb3))
## [12.17.2](v12.17.1...v12.17.2) (2026-10-12) ### Bug Fixes * track Apple TV tunnels by pair record UDID ([#3032](#3032)) ([10e7d17](10e7d17))
- shutdown signals ran cleanup but never called process.exit, so any handle left open kept the process alive - repeated signals were swallowed by the cleanup-once guard, so Ctrl+C could not stop it - exit after cleanup on shutdown signals - force exit on a repeated signal while cleanup is still running
## [12.17.3](v12.17.2...v12.17.3) (2026-10-12) ### Bug Fixes * make tunnel-creation exit on Ctrl+C ([#3033](#3033)) ([1dde1ec](1dde1ec))
* fix: retain and clean up screen recorder after stop failure (cherry picked from commit 1a32f67) * test: adapt beta recorder retry regression to kill escalation
BREAKING CHANGE: Removed the undocumented XCUITestDriver.executeAtomAsync method. It had no internal callers and was not exposed as a command. Driver subclasses that call it should use this.remote.executeAtomAsync(atom, args, this.curWebFrames) followed by this.waitForAtom(promise) instead.
#3041) BREAKING CHANGE: Removed the asyncWaitMs driver property. Use scriptTimeoutMs (base driver) instead. BREAKING CHANGE: GET /timeouts reports script: null for a new session, not 0. BREAKING CHANGE: execute now uses the script timeout that the client sets (before: ignored). A client that sends 0, or a value shorter than its scripts, now gets script timeout.
* feat: add execute method for retrieving pressable buttons * chore: fix route name * docs: update description
…m unzip (#3080) BREAKING CHANGE: the bsdtar utility is no longer used and the APPIUM_PREFER_SYSTEM_UNZIP environment variable has no effect. Non-UTF-8-flagged zip file names are decoded as utf8; cp437 is not supported.
…(tunnel preferred, usbmux fallback) (#3082) BREAKING CHANGE: appium-ios-device is no longer used. BREAKING CHANGE: The lockdown simulate-location service is gone, so setting the geolocation on real devices below iOS/tvOS 17 is not supported. BREAKING CHANGE: The appium:safariSocketChunkSize capability has been removed. BREAKING CHANGE: The appium:safariWebInspectorMaxFrameLength no longer has an effect on real devices. BREAKING CHANGE: mobile: killApp always returns false on real devices below iOS/tvOS 17 (and on Linux/Windows hosts without a tunnel), because the instruments service it used is gone.
…exts (#3090) * fix: stop stale remote debugger listeners when switching webview contexts * chore(deps): bump appium-remote-debugger to ^18.0.3 * refactor: split setContext into private helpers
…ks removal for real devices (#3079)
* fix: remove perf recording temp files when start or upload fails * style: format performance spec
…rce excludedAttributes (#3078)
* fix: align default screenshotQuality setting with WDA * refactor: make WDA the source of truth for its settings
|
[High impact] The PR appears safe to merge; the remaining duplicate-test finding is non-blocking. Findings
|
| it('should pass value and maxAttempts through to WDA', async function () { | ||
| const opts = {elementId: 4, order: 'next', value: 'myvalue', maxAttempts: 50}; | ||
| mockDriver | ||
| .expects('proxyCommand') | ||
| .once() | ||
| .withExactArgs('/wda/pickerwheel/4/select', 'POST', {order: 'next', value: 'myvalue', maxAttempts: 50}); | ||
| await driver.execute(`mobile: ${commandName}`, opts); |
There was a problem hiding this comment.
This test exactly repeats the picker-wheel test at lines 254–261. The rebase also duplicates the PerfRecorder.start cleanup test in test/unit/commands/performance.spec.ts. Remove one copy of each: running both adds no coverage and leaves future fixes to update two places.
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
Restore beta's versions of files where the rebase of duplicated master backports regressed them (recordscreen, types, implicit-wait, driver command table) and fix a duplicated test declaration.
589752f to
d9d43f9
Compare
Rebases
betaontomasterso thatmasterbecomes an ancestor ofbeta, which allows promoting beta to the stable 13.0.0 release with a fast-forward push (merge commits are disabled).Do not merge with the GitHub buttons. This is landed with
git push --force-with-lease=beta:cfc27be50 origin sync/rebase-beta:beta, so original commit SHAs are preserved.masteradds tobeta: the 12.x release content (CHANGELOG, workflow action bumps, new tests). The commit list looks duplicated (old vs rebased SHAs); ignore it.chore(release): 13.0.0-beta.*commits were dropped; the stable release regenerates the changelog section.appium-ios-device, prototype command table), keeping master's newer docs/tests.chorecommit restores beta's versions of files that the rebase regressed; the resulting source tree is identical to the currentbetaapart from master's added tests.Local verification:
tsc -b,oxlint, 807 unit tests pass.