After an Appium 3 upgrade, which /appium/... routes stop answering and what replaces them?
answer
- removed, or only moved?
- old routes became mobile: methods
- log became se/log
- one route, two platform replacements
- grep the driver method maps
basics
~20 sAppium 3 removed most of the old /appium/... routes, moving that work into per-driver mobile: execute methods: app reset became mobile: clearApp, and press_keycode became mobile: pressKey on the Android drivers. Some routes only moved, not vanished.
solid answer
~40 sAppium 3 pushed the old mobile-specific endpoints into per-driver execute methods. `POST .../appium/app/reset` became `mobile: clearApp`, `app/background` became `mobile: backgroundApp`, `device/press_keycode` became `mobile: pressKey` on the Android drivers, and the wifi, data and airplane toggles collapsed into `mobile: setConnectivity` there; separately `POST /session/:sessionId/log` became `.../se/log` and `POST .../execute` became `.../execute/sync`. One old route often needs **two** replacements, because the replacement lives in a driver and drivers are per platform. The senior half of the answer is the distinction between *removed* and *moved to the drivers*: the screen-recording route is re-added by both the Android driver and the XCUITest driver, and the app-management and keyboard endpoints are still declared in the core route table. Verify against the route tables and the drivers' method maps before rewriting a call.
go deeper
Recognise the symptom: a suite written against the old /appium/ routes gets unknown-route failures on an Appium 3 server, and the fix is usually a mobile: execute method rather than a rewritten test.
Be able to map a few by hand — app reset to mobile: clearApp, app background to mobile: backgroundApp, press_keycode to mobile: pressKey on the Android drivers — and say that the replacement name is per driver.
Show the discipline that separates removed from moved. Screen recording, the app-management routes and the keyboard endpoints all survive on the drivers or in the core route table, so verify before rewriting a call.
Own the upgrade as a plan: inventory which endpoints the suite touches, decide what gets rewritten versus contained behind one call site, and budget the per-platform divergence the execute-method replacements introduce.
## What Appium 3 actually changed here Appium 2 was the architectural watershed: drivers and plugins became separately installed extensions and non-standard capabilities took the `appium:` vendor prefix. Appium 3 is the narrower follow-up, and its most visible piece is subtraction. A large block of the old `/session/:sessionId/appium/...` routes — the mobile-specific endpoints Appium carried from before the W3C specification settled — is gone from the server, and that work moved into per-driver execute methods invoked through `POST /session/:sessionId/execute/sync`. For a curling-club ladder suite written against the older surface the symptom is blunt: the session still starts, and then the step that used to reset the app or press a hardware key comes back as an unknown route. Nothing warned you at session creation, because none of this is negotiated there. ## The replacements that matter | Old route | Replacement | |---|---| | `POST .../appium/app/reset` | `mobile: clearApp` | | `POST .../appium/app/launch` | `mobile: launchApp` on XCUITest; `mobile: activateApp` or `mobile: startActivity` on the Android drivers | | `POST .../appium/app/close` | `mobile: terminateApp` | | `POST .../appium/app/background` | `mobile: backgroundApp` | | `POST .../appium/device/press_keycode` | `mobile: pressKey` on the Android drivers | | `POST .../appium/device/toggle_wifi`, `toggle_data`, `toggle_airplane_mode` | `mobile: setConnectivity` on the Android drivers | | `POST .../appium/device/network_speed` | `mobile: networkSpeed`, Android emulators only | | `POST /session/:sessionId/log` | `POST /session/:sessionId/se/log` | | `GET /sessions` | `GET /appium/sessions` | | `POST /session/:sessionId/execute` | `POST /session/:sessionId/execute/sync` | Two patterns run through that table, and both are the point of the change: - One old route often needs **two** replacements, because the replacement lives in a driver and drivers are per platform. Launching the ladder app is `mobile: launchApp` on the XCUITest driver for Apple platforms, and `mobile: activateApp` or `mobile: startActivity` on the Android drivers. The old endpoint hid a divergence the execute methods expose. - Some replacements are **narrower than the route they replace**. `mobile: networkSpeed` on the Android drivers is emulator-only, and `mobile: clearApp` is real on iOS but works on a simulator and throws on a real device. A green simulator run proves nothing about the device fleet. ## Removed is not the same as moved The migration guide marks a route *removed with a replacement* differently from a route *moved to the drivers*, and reading past that marker produces confident, wrong rewrites. Measured counter-examples worth knowing: - **Screen recording moved, it did not vanish.** Both the Android driver and the XCUITest driver re-add `POST .../appium/start_recording_screen` through their own method maps, un-deprecated, so it still answers on those drivers. The execute methods `mobile: startMediaProjectionRecording` on Android and `mobile: startXCTestScreenRecording` on iOS are the richer replacements, not the only way. - **The app-management endpoints survived.** `install_app`, `remove_app`, `app_installed`, `activate_app`, `terminate_app` and `app_state` are still declared in the core route table; the `mobile:` methods are the richer per-driver surface beside them. - **The keyboard endpoints survived.** `hide_keyboard` and `is_keyboard_shown` are still in the core route table. - **Legacy timeout parameters survived.** The guide says `POST /session/:sessionId/timeouts` no longer takes `type` and `ms`, but the core route still declares them as optional and the base implementation still handles that branch. The generalisation is the useful part: a driver can re-declare a route the core dropped, and a driver that proxies commands to an on-device agent can answer a route its own source barely mentions. Do not assert a removal you have not checked against the route tables. ## A migration that does not guess 1. **Inventory what the suite actually calls.** Grep for the old path segments and for the helper names your client wraps around them; a helper that still compiles tells you nothing about whether the server answers. 2. **Read the guide's markers, not just its list.** Separate *removed with a replacement* from *moved to the drivers* before touching code. 3. **Verify each supposed removal.** Check the core route table for endpoints the server still declares, and each driver's method map for routes it re-adds. 4. **Replace per platform, not once.** Expect the Android drivers and the XCUITest driver to need different names and different parameter maps for the same intent. 5. **Re-run against both fleets.** Gated replacements such as the emulator-only and simulator-only ones only show up when the run touches a real device. ## Why this is a senior question Because the naive version of the answer — "Appium 3 deleted the `/appium/` routes, rewrite everything as `mobile:` calls" — produces churn on endpoints that never went away and misses the divergence the real replacements introduce. The valuable behaviour is checking the route tables and the drivers' method maps before declaring anything gone, and planning the rewrite as a per-platform change rather than a search and replace.
- How do you check whether a route the migration guide lists is genuinely gone?Read the guide's own markers first — it separates a removal with a replacement from a route moved to the drivers — then check the tables: the core route file for endpoints the server still declares, and each driver's method map for routes it re-adds. Screen recording is re-added exactly that way by both the Android driver and the XCUITest driver.
- Why does one removed route often need two different replacements?Because the replacement lives in a driver, and drivers are per platform. Launching an app maps to `mobile: launchApp` on the XCUITest driver for Apple platforms and to `mobile: activateApp` or `mobile: startActivity` on the Android drivers. The old endpoint papered over a divergence that the execute methods make explicit.
saying these in an interview costs you the question
- Assumes every /appium/ route is gone in Appium 3
- Says iOS has no clearApp equivalent at all
- Trusts the migration guide without checking the driver method maps
- Expects one replacement name to cover Android and iOS
- Thinks screen recording was deleted rather than moved to the drivers
- Treats a client helper that still compiles as proof the server answers