From f94c4f1f0766d98502042440f7866581d43e55b5 Mon Sep 17 00:00:00 2001 From: Gabe Debes Date: Mon, 19 Oct 2026 20:39:52 -0700 Subject: [PATCH] [build-tools] Run Appium iOS sessions with a headless Simulator Co-Authored-By: Claude Opus 5.5 --- .changeset/appium-headless-simulator.md | 5 +++++ .../functions/__tests__/startAppiumRemoteSession.test.ts | 2 ++ .../src/steps/functions/startAppiumRemoteSession.ts | 8 +++++++- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 .changeset/appium-headless-simulator.md diff --git a/.changeset/appium-headless-simulator.md b/.changeset/appium-headless-simulator.md new file mode 100644 index 0000000000..f022243c67 --- /dev/null +++ b/.changeset/appium-headless-simulator.md @@ -0,0 +1,5 @@ +--- +'@expo/build-tools': patch +--- + +Keep the launched app open when an Appium iOS session starts. diff --git a/packages/build-tools/src/steps/functions/__tests__/startAppiumRemoteSession.test.ts b/packages/build-tools/src/steps/functions/__tests__/startAppiumRemoteSession.test.ts index 3c70590799..5c7a647d8f 100644 --- a/packages/build-tools/src/steps/functions/__tests__/startAppiumRemoteSession.test.ts +++ b/packages/build-tools/src/steps/functions/__tests__/startAppiumRemoteSession.test.ts @@ -361,6 +361,7 @@ describe('createStartAppiumRemoteSessionBuildFunction session lifecycle', () => expect(IosSimulatorUtils.getDeviceAsync).not.toHaveBeenCalled(); expect(JSON.parse(jest.mocked(spawnDetached).mock.calls[0][0].args.at(-1)!)).toEqual({ 'appium:eventTimings': true, + 'appium:isHeadless': true, 'appium:usePreinstalledWDA': true, 'appium:prebuiltWDAPath': '/tmp/legacy-wda.app', }); @@ -447,6 +448,7 @@ describe('createStartAppiumRemoteSessionBuildFunction session lifecycle', () => ); expect(JSON.parse(jest.mocked(spawnDetached).mock.calls[0][0].args.at(-1)!)).toEqual({ 'appium:eventTimings': true, + 'appium:isHeadless': true, 'appium:usePreinstalledWDA': true, 'appium:prebuiltWDAPath': '/tmp/selected-wda.app', }); diff --git a/packages/build-tools/src/steps/functions/startAppiumRemoteSession.ts b/packages/build-tools/src/steps/functions/startAppiumRemoteSession.ts index 4eb0073ad9..8d1e0fac17 100644 --- a/packages/build-tools/src/steps/functions/startAppiumRemoteSession.ts +++ b/packages/build-tools/src/steps/functions/startAppiumRemoteSession.ts @@ -242,7 +242,13 @@ export function createStartAppiumRemoteSessionBuildFunction( '--allow-insecure', '*:session_discovery', '--default-capabilities', - JSON.stringify({ 'appium:eventTimings': true, ...wdaCapabilities }), + JSON.stringify({ + 'appium:eventTimings': true, + // Without it, XCUITest restarted the booted Simulator at session start, which + // closed the app serve-sim had launched. EAS VMs never show the Simulator window. + ...(device.platformName === 'iOS' ? { 'appium:isHeadless': true } : {}), + ...wdaCapabilities, + }), ], env: appiumEnv, logger,