World’s largest virtual agentic engineering & quality conference
This Appium 2 migration guide will provide you with clear instructions on how to smoothly transition from the 1.x version to the 2.x version of Appium.

Wasiq Bhamla
Author
Published on: July 18, 2023
Last Updated on: July 16, 2026
On This Page
Appium is the most popular open-source library for automating platforms such as Android, iOS, tvOS, Mac, and Windows. It also supports Native, Hybrid, and Web applications.
Appium has been around for almost a decade, and its very first version, 0.0.1, was released ten years ago.
The maintainers of Appium had supported Appium 1.x for almost eight years before they suggested using Appium 2.x beta versions. Even the very first 2.0.0 beta version was released almost three years ago.
Appium 2.0 reached general availability in 2023, and it is now the default major version for new mobile automation projects.
Overview
Appium 2.x is a modular and W3C-compliant version of Appium that decouples drivers and plugins from the main server, giving testers more flexibility and control.
What Are the Changes in Appium 2.x?
Appium 2.x introduces modular architecture, removes bundled drivers, supports only the W3C WebDriver protocol, and replaces old CLI flags with driver or plugin commands. It also deprecates Appium Desktop and relocates image comparison and execute driver features into plugins.
How Are Appium Drivers Decoupled?
In Appium 2.x, only the server is installed by default. Drivers must be managed separately using appium driver commands to install, list, or uninstall specific ones giving developers control over which drivers to use.
What Are the Appium Driver Command Line Option Changes?
Driver-specific CLI options have been moved to their respective drivers or capabilities. For example, --chromedriver-executable is replaced by the capability appium:chromedriverExecutable, streamlining configuration.
What Are the Protocol and Capabilities Updates?
Appium 2.x drops MJSONWP, supporting only W3C protocol. All capabilities, except browserName and platformName, now need vendor prefixes like appium:capabilityName.
What New Features Are Introduced in Appium 2.x?
Whenever a major version ships for any library, existing users need a migration guide to move from the older version to the new one.
That is exactly what this Appium 2 migration guide covers.
This Appium 2 migration guide will walk you through exactly what to do to migrate from 1.x to 2.x.
— Jonathan Lipps (@jlipps) July 5, 2023
Check out the Appium 2.0.0 changelog here.
Before migrating, install Appium 2.x cleanly. The steps are the same on Windows, macOS, and Linux once Node.js is in place.
node -v and npm -v.npm install -g appium. Unlike 1.x, this installs only the server, with no bundled drivers.appium driver install uiautomator2; for iOS, run appium driver install xcuitest.ANDROID_HOME and JAVA_HOME for Android and Xcode command-line tools for iOS, adding them as Windows environment variables.appium driver doctor uiautomator2 to check your environment, then run appium to start the server on the default root path.Many breaking changes were introduced in Appium 2.x. Let’s check out all the breaking changes and understand each. To delve deeper into the realm of Appium, explore our dedicated hub focusing on Appium Interview Questions.
In Appium 1.x, when the server started, it accepted Appium commands by default on the URL http://localhost:4723/wd/hub.
This base path of /wd/hub was hardcoded in the Appium Server, and you could not change it.
But with Appium 2.x, this base path is now configurable, and the default has changed. The default base path is now the root path / instead of /wd/hub.
If your client scripts still point to /wd/hub, they will fail to connect until you update the endpoint in your capabilities or start the server with the old path.
To restore the old /wd/hub path for backward compatibility, start the Appium Server with the --base-path flag:
appium --base-path /wd/hub
Looking to perform mobile app testing using Appium?
TestMu AI, a digital experience testing platform, lets you run app test automation with Appium on a real device cloud of 10,000+ real Android and iOS devices.
In Appium 1.x, installing the Appium command line tool installed every available driver Appium supported.
This meant many files landed on your machine, even for drivers you did not need.
With Appium 2.x, this behavior has changed. Installing the Appium command line tool installs only the Appium server component.
You now have more control over which driver to use, installing only the ones you want to work with.
You can install these drivers or check out which drivers are available in Appium. For example, you can execute the following command to list down the available drivers:
appium driver list
Or, run the following command to install any of the drivers you want:
appium driver install <driver-name>
You can also mention the driver name when you are installing the Appium command line tool itself by using the following command:
npm install --global appium --drivers=uiautomator2,xcuitest
It is also highly recommended to uninstall all the early installations of Appium 1.x by running the following command:
npm uninstall --global appium
Note: Automate mobile app testing using Appium 2.x. Try TestMu AI Today!
In Appium 1.x, installing the command line tool installed all Appium drivers at once, inside the node_modules folder in the main Appium Server binary folder.
For example, all the drivers would sit in the /path/to/appium/node_modules directory.
With Appium 2.x, the default path for installing the Appium driver is now set to the APPIUM_HOME, which is ~/.appium. So, when you install any Appium driver, it will get saved in $APPIUM_HOME/node_modules/< driver-name >.
With Appium 1.x, you were able to use the following command line flags while installing the Appium server to control how the Chrome driver would get installed:
--chromedriver-skip-install--chromedriver-version--chromedriver-cdnurlWith Appium 2.x, all these command line flags have been removed because all these flags are now implemented as NPM config flags. Now, you can use the following environment variables instead of the earlier flags:
You can use these environment variables as shown in the following example:
APPIUM_SKIP_CHROMEDRIVER_INSTALL=1 appium driver install uiautomator2
Here you are skipping Chrome driver installation by setting APPIUM_SKIP_CHROMEDRIVER_INSTALL as 1, which indicates true. Watch the given video below to set up your Appium 2.0 complete installation guide in detail:
Co-Founder, Steadfast Systems
Discovered @TestMu AI yesterday. Best browser testing tool I've found for my use case. Great pricing model for the limited testing I do 👏
Deliver immersive digital experiences with Next-Generation Mobile Apps and Cross Browser Testing Cloud
With Appium 1.x, many command line options were specific to a particular driver but available on the main Appium Server.
For example, to set the Chrome driver location, you would use the --chromedriver-executable flag with the Appium command.
With Appium 2.x, these command line options have moved from the main Appium Server command to the individual driver commands.
Some options were removed entirely, replaced by capabilities you can use to set them instead.
For example, the --chromedriver-executable command line option has been removed from the uiautomator2 driver and replaced with appium:chromedriverExecutable capability, which you can use and set the Chrome driver executable path.
With Appium 1.x, calling a command a driver did not implement threw a 501 Not Yet Implemented exception.
In Appium 2.x, that error is replaced with 404 Not Found when you call a command the driver does not implement.
With Appium 1.x, whenever you wanted to update the drivers, you had to wait for the actual Appium library to roll out the new version to update all the outdated drivers.
With Appium 2.x, since you now have a separate driver command, you have more control over when to update which driver without worrying about the main Appium Server version.
For example, you can execute the following command to see which driver has a new update available:
appium driver list --updates
And when you want to update any driver, you can simply run the following command to update it:
appium driver list [driver-name]
Here, [driver-name] is the driver’s name you want to update.
In Appium 1.x, Appium API supported MJSONWP (Mobile JSON wire protocol) and W3C WebDriver protocol. But with Appium 2.x, it now only supports W3C WebDriver protocol.
In Appium 1.x, capabilities were used as is, without vendor prefixes.
In Appium 2.x, only browserName and platformName keep no vendor prefix; all other capabilities require one.
The vendor prefix joins the vendor and capability name with a colon, for example appium:< capability-name >.
This format is specific to W3C protocol specification. If the vendor prefix is not required, it will be explicitly mentioned in the documentation.
This approach is automatically handled in the Appium client bindings in different programming languages. Also, the new Appium Inspector version has this feature to automatically add the vendor prefix to the respective capability name.
Note: Boost your efficiency by ultimate guide of Appium Commands Cheat Sheet for Developers.
There may be many Appium commands that may not have been moved to the respective drivers, or plugins will be removed in the Appium clients first from the Appium Server.
Image comparison commands were available in Appium 1.x, which has been moved to a separate plugin called images, which you can install separately using the Appium plugin command.
For example, you can install this plugin by running the appium plugin install images.
And you can use this plugin in your Appium session by providing --use-plugins=images to the Appium Server command while starting the server session.
The execute driver script command, available in Appium 1.x has been moved to a separate plugin called execute-driver, which you can install separately using the Appium plugin command.
For example, you can install this plugin by running the appium plugin install execute-driver.
And you can use this plugin in your Appium session by providing --use-plugins=execute-driver to the Appium Server command while starting the server session.
With Appium 1.x, you could start the Appium Server with a port set as 0. This meant that Appium would identify any available free port to start the Appium session.
But with Appium 2.x, this is not allowed. The port number should be greater than 0. This means that you must know beforehand which port number you want to start the Appium session.
Many internal packages were renamed. For example, appium-base-driver is now named @appium/base-driver. This change will not impact the users, but it will impact those who maintain code that directly works with Appium code.
All the old drivers, like UIAutomator1, which were part of Appium 1.x have been removed. It also removed other related tools like authorize-ios.
If your Node.js tests use the legacy wd client library, this is one of the most important migration steps. The wd library is officially deprecated and is no longer supported in Appium 2.x.
Migrate your Node.js test suites to a modern, actively maintained client such as WebdriverIO, which fully supports the W3C WebDriver protocol that Appium 2.x requires.
Staying on wd means missing protocol updates and receiving no further fixes.
Appium 2.x no longer accepts external files passed to --nodeconfig, --default-capabilities, or --allow-insecure through the command line.
Instead, these settings now live inside the new Appium configuration file (JSON, JS, or YAML).
Move any values you previously passed as external files into that config file so the server picks them up on startup.
In Appium 1.x, you used Appium Desktop with Appium Inspector integrated inside it.
In Appium 2.x, Appium Desktop is deprecated and does not support the new version. Appium Inspector is now a standalone desktop application for inspecting elements.
Appium Inspector also comes as a web application, available at https://inspector.appiumpro.com.
Just remember to start the Appium server with the --allow-cors flag so the web Appium Inspector can connect to your local Appium Server session.
There were a few new major features that have been introduced with Appium 2.x, which are described below:
Now it is possible to create Appium plugins. Plugins are a feature that helps extend and modify the Appium behavior as required. You can install, update or uninstall the plugin as you require.
You can now install any Appium driver using the driver commands. You can also create a new driver to support a new platform that Appium currently does not support.
With Appium 2.x, you can now create an Appium config file with commonly used Appium Server flags configured in this config file. This config file can be in any of the following formats:
That is all in this short Appium 2 migration guide on moving from Appium 1.x to Appium 2.x, and what to keep in mind.
It also prepares you for Appium 3 features and future enhancements. Share this guide with your network to help them upgrade.
Moving your suites onto the cloud? See how to migrate existing Appium test suites to TestMu AI.
Author
Wasiq Bhamla is a Test Automation specialist having more than 15 years of experience in Manual and Automation testing. He has vast experience in automating Desktop, Web, API, Android, and iOS-based applications. He is also an active open-source contributor on GitHub, a freelancer, a mentor, and a blogger. You can also follow him on Twitter.
Did you find this page helpful?
More Related Blogs
TestMu AI forEnterprise
Get access to solutions built on Enterprise
grade security, privacy, & compliance