Skip to main content
Use @qawolf/flows/ios for iOS app automation.

Launch The App First

import { flow } from "@qawolf/flows/ios";

export default flow(
  "Open app",
  { target: "iOS - iPhone 15 (iOS 26)", launch: true },
  async ({ driver }) => {
    await driver.$("~Continue").click();
  },
);
driver is the Appium/WebdriverIO session for the iOS device. For exact target strings, see Target Literals.

Launch With An Uploaded App

When the runner provides RUN_INPUT_PATH, omit app and pass normal app metadata.
import { flow, launch } from "@qawolf/flows/ios";

export default flow(
  "Open uploaded build",
  "iOS - iPhone 15 (iOS 26)",
  async () => {
    const { driver } = await launch({
      bundleId: "com.example.ios",
    });

    await driver.pause(1000);
  },
);
If you pass app, QA Wolf uses that explicit source instead of RUN_INPUT_PATH.
await launch({
  app: { path: "ios/MyApp.app" },
  bundleId: "com.example.ios",
});
For the full iOS launch shape and app resolution rules, see the iOS Reference.

Install A Configuration Profile

device proxies the iOS device API. installConfigurationProfile needs both the active driver and a profile string.
import { device, flow } from "@qawolf/flows/ios";

const profile = `<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0"><dict></dict></plist>`;

export default flow(
  "Install profile",
  { target: "iOS - iPhone 15 (iOS 26)", launch: true },
  async ({ driver }) => {
    await device.installConfigurationProfile(driver, profile);
  },
);
For other simulator or device helpers, use the iOS Reference.
Last modified on April 24, 2026