* chore(tsconfig): update dependency @tsconfig/node14 to v14.1.3 (#21065) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(workflows): update peter-evans/create-pull-request action to v7.0.8 (#21066) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency typescript-eslint to v8.26.0 (#21068) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update definitelytyped (#21067) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(docutils): update dependency typescript to v5.8.2 (#21057) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(docutils): update dependency mkdocs-git-revision-date-localized-plugin to v1.4.1 (#21071) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * feat(images-plugin): supports image elements included in actions. (#21055) * chore(types): update dependency type-fest to v4.37.0 (#21073) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency finalhandler to v2 (#21074) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * test: Update tests of images plugin (#21078) * test(images-plugin): Fix test host (#21079) * chore(support): update dependency axios to v1.8.2 (#21080) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency eslint-config-prettier to v10.1.1 (#21081) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(fake-driver): accept 3.0.0-beta.0 as well (#21076) * feat: Add storage plugin (#21075) * chore(deps): update dependency @types/node to v22.13.10 (#21084) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * docs(base-driver): remove outdated READMEs (#21083) * chore(deps): update eslint-related packages to v9.22.0 (#21085) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * feat(storage-plugin): Tune the files keeping behaviour (#21086) * docs(appium): fix a broken character that caused incorrect rendering of mkdocs (#21090) (#21091) * chore(storage-plugin): Simplify add to storage logic (#21092) * chore(docutils): update dependency mkdocs-git-revision-date-localized-plugin to v1.4.4 (#21093) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * docs: add storage-plugin documentation (#21096) * chore: fix typo * chore: list storage-plugin as a known plugin * docs: align storage-plugin docs with other plugins * chore: address comments * chore(deps): update eslint-related packages (#21097) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(base-driver): Fix proxy url generation (#21099) * chore: publish - appium@2.17.0 - @appium/base-driver@9.16.3 - @appium/base-plugin@2.3.4 - @appium/docutils@1.0.33 - @appium/driver-test-support@0.7.7 - @appium/execute-driver-plugin@4.0.3 - @appium/fake-driver@5.7.2 - @appium/fake-plugin@3.2.4 - @appium/images-plugin@3.1.0 - @appium/plugin-test-support@0.3.52 - @appium/storage-plugin@0.1.0 - @appium/support@6.0.7 - @appium/test-support@3.1.7 - @appium/tsconfig@0.3.5 - @appium/types@0.25.2 - @appium/universal-xml-plugin@1.0.31 * chore(deps): update dependency eslint-import-resolver-typescript to v3.8.5 (#21101) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(support): update dependency axios to v1.8.3 (#21102) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(execute-driver-plugin): update dependency webdriverio to v9.12.0 (#21072) * chore(deps): update dependency eslint-import-resolver-typescript to v3.8.6 (#21103) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency eslint-import-resolver-typescript to v3.8.7 (#21107) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(docutils): update dependency mkdocs-material to v9.6.8 (#21108) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(universal-xml-plugin): update dependency fast-xml-parser to v5 (#21109) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency eslint-import-resolver-typescript to v3.9.0 (#21113) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(docutils): update dependency mkdocs-git-revision-date-localized-plugin to v1.4.5 (#21112) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency eslint-import-resolver-typescript to v3.9.1 (#21115) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(docutils): update dependency mkdocs-material to v9.6.9 (#21121) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(base-driver): Exclude proxied headers from the server response (#21120) * chore: publish - appium@2.17.1 - @appium/base-driver@9.16.4 - @appium/base-plugin@2.3.5 - @appium/docutils@1.0.34 - @appium/driver-test-support@0.7.8 - @appium/execute-driver-plugin@4.0.4 - @appium/fake-plugin@3.2.5 - @appium/images-plugin@3.1.1 - @appium/storage-plugin@0.1.1 - @appium/support@6.0.8 - @appium/test-support@3.1.8 - @appium/universal-xml-plugin@1.0.32 * docs: update zh contributing documentation (#21117) * Translate Validation of Individual Arguments via AJV section * Complete the translation of the config system file * chore(docutils): update dependency consola to v3.4.2 (#21124) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/express to v5.0.1 (#21126) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(support): update dependency axios to v1.8.4 (#21127) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(execute-driver-plugin): update dependency webdriverio to v9.12.1 (#21129) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency typescript-eslint to v8.27.0 (#21131) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(eslint-config-appium-ts): update dependency eslint-import-resolver-typescript to v4 (#21119) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(test-support): update dependency sinon to v19.0.4 (#21130) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/node to v22.13.11 (#21135) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * feat: Add a possibility to mask sensitive log values depending on request headers (#21123) * chore(deps): update eslint-related packages to v9.23.0 (#21138) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(types): update dependency type-fest to v4.38.0 (#21140) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update definitelytyped (#21139) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(test-support): update dependency sinon to v19.0.5 (#21141) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update eslint-related packages (#21142) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(test-support): update dependency sinon to v20 (#21143) * chore(test-support): update dependency sinon to v20 * remove usingPromise --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Mykola Mokhnach <mokhnach@gmail.com> * chore(deps): update dependency eslint-import-resolver-typescript to v4.2.5 (#21146) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update definitelytyped (#21147) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(storage-plugin): Use base driver import for W3C error response creation (#21153) * chore(deps): update dependency eslint-import-resolver-typescript to v4.2.7 (#21155) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(execute-driver-plugin): update dependency webdriverio to v9.12.2 (#21151) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(docutils): update dependency yaml to v2.7.1 (#21158) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency eslint-import-resolver-typescript to v4.3.1 (#21159) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * feat(base-driver): Accept `x-request-id` as override to generated requestId in `handleLogContext` (#21154) * chore(docutils): update dependency mkdocs-material to v9.6.10 (#21161) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency typescript-eslint to v8.29.0 (#21165) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update definitelytyped (#21164) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(docutils): update dependency mkdocs-material to v9.6.11 (#21167) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(types): update dependency type-fest to v4.39.0 (#21168) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(docutils): add & adjust various log messages (#21160) * fix(docutils): add & adjust various log messages * fix: use npm from support package for npm calls * chore(deps): update dependency @types/node to v22.14.0 (#21172) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(types): update dependency type-fest to v4.39.1 (#21173) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * fix(logger): Error stack logging (#21176) * chore(execute-driver-plugin): update dependency webdriverio to v9.12.3 (#21177) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(universal-xml-plugin): update dependency fast-xml-parser to v5.2.0 (#21178) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(docutils): update dependency typescript to v5.8.3 (#21179) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(execute-driver-plugin): update dependency webdriverio to v9.12.4 (#21180) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update eslint-related packages to v9.24.0 (#21182) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(support): update dependency sharp to v0.34.0 (#21183) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * feat(docutils): add MkDocs Material codeblock & text format features (#21184) * chore(docutils): reorder Markdown extensions alphabetically * feat(docutils): add MkDocs Material codeblock features * chore(docutils): explicitly add Markdown tables support * feat(docutils): add MkDocs Material linked tabs * feat(docutils): add MkDocs Material text format features * feat(docutils): add MkDocs Material task list * fix(ci): run on all Node LTS versions instead of only active (#21185) * fix(ci): run on LTS versions instead of only active * chore: address comments * chore(deps): update dependency eslint-import-resolver-typescript to v4.3.2 (#21186) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency typescript-eslint to v8.29.1 (#21189) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(support): update dependency sharp to v0.34.1 (#21191) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency tsd to v0.32.0 (#21194) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency eslint-config-prettier to v10.1.2 (#21195) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency lerna to v8.2.2 (#21197) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update dependency @types/node to v22.14.1 (#21199) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(execute-driver-plugin): update dependency webdriverio to v9.12.5 (#21200) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(base-driver): Mark IME commands and receive_async_response as deprecated (#21201) * docs(appium): add NovaWindows driver to Appium other drivers list (#21202) * chore(deps): update dependency typescript-eslint to v8.30.1 (#21206) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(types): update dependency type-fest to v4.40.0 (#21208) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(base-driver): Mark /session/:sessionId/network_connection deprecated (#21209) * chore(execute-driver-plugin): update dependency webdriverio to v9.12.6 (#21210) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(docutils): update dependency mkdocs-material to v9.6.12 (#21211) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update eslint-related packages (#21214) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(deps): update eslint-related packages (#21216) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(execute-driver-plugin): update dependency webdriverio to v9.12.7 (#21218) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * docs: update Appium 2 migration guide (#21215) * docs: rewrite Appium 2 migration guide * docs: reorder breaking changes * docs: identify changed endpoints * docs: improve code example * docs: address comments * chore(universal-xml-plugin): update dependency fast-xml-parser to v5.2.1 (#21220) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * docs: remove SeleniumConf banner (#21221) * docs(appium): address default timeout in newCommandTimeout (#21222) * chore: publish - appium@2.18.0 - @appium/base-driver@9.17.0 - @appium/base-plugin@2.3.6 - @appium/docutils@1.1.0 - @appium/driver-test-support@0.7.9 - @appium/eslint-config-appium-ts@1.0.4 - @appium/execute-driver-plugin@4.0.5 - @appium/fake-plugin@3.2.6 - @appium/images-plugin@3.1.2 - @appium/logger@1.7.0 - @appium/opencv@3.0.9 - @appium/plugin-test-support@0.3.53 - @appium/storage-plugin@0.1.2 - @appium/support@6.1.0 - @appium/test-support@3.1.9 - @appium/types@0.25.3 - @appium/universal-xml-plugin@1.0.33 * chore(deps): update dependency @types/node to v22.15.2 (#21223) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * chore(support): update dependency axios to v1.9.0 (#21225) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: kkb912002 <57607392+kkb912002@users.noreply.github.com> Co-authored-by: Mykola Mokhnach <mokhnach@gmail.com> Co-authored-by: Kazuaki Matsuo <fly.49.89.over@gmail.com> Co-authored-by: Sakura Nene <blade1565@outlook.com> Co-authored-by: Jonathan Lipps <jonathan.lipps@sony.com> Co-authored-by: zhangxh075 <zhangxh075@163.com> Co-authored-by: Regan Karlewicz <regan@karlewr.net> Co-authored-by: Teodor Nikolov <teo8447@gmail.com>
Cross-platform test automation for native, hybrid, mobile web and desktop apps.
Documentation | Get Started | Ecosystem | Changelog | Contributing Guide | Discussion Forum
Appium is an open-source automation framework that provides WebDriver-based automation possibilities for a wide range of different mobile, desktop and IoT platforms. Appium is modular and extensible, and supports multiple programming languages, which means there is an entire ecosystem of related software:
- Drivers add support for automating specific platforms
- Clients allow writing Appium tests in your programming language of choice
- Plugins allow to further extend Appium functionality
Migrating From Appium 1 to Appium 2
As of January 1st, 2022, the Appium team no longer maintains or supports Appium 1. All officially supported platform drivers are only compatible with Appium 2.
Please read the Migration Guide if you are still using Appium 1.
Warning
If you use Appium Desktop or Appium Server GUI, you will not be able to upgrade to Appium 2, as both of these tools have been deprecated. Please use Appium Inspector in combination with a standalone Appium 2 server.
Installation
Appium can be installed using npm (other package managers are not currently supported). Please
check the installation docs for the
system requirements and further information.
If upgrading from Appium 1, make sure Appium 1 is fully uninstalled (npm uninstall -g appium).
Unexpected errors might appear if this has not been done.
npm i -g appium
Note that this will only install the core Appium server, which cannot automate anything on its own. Please install drivers for your target platforms in order to automate them.
Drivers
Appium supports app automation across a variety of platforms, like iOS, Android, macOS, Windows, and more. Each platform is supported by one or more "drivers", which know how to automate that particular platform. You can find a full list of officially-supported and third-party drivers in Appium Ecosystem's Drivers page.
Driver management is done using Appium's Extension command-line interface:
# Install an official driver from npm (see documentation for a list of such drivers)
appium driver install <driver-name>
# Install any driver from npm
appium driver install --source=npm <driver-name>
# See documentation for installation from other sources
# List already installed drivers
appium driver list --installed
# Update a driver (it must be already installed)
# This will NOT update the major version, in order to prevent breaking changes
appium driver update <driver-name>
# Update a driver to the most recent version (may include breaking changes)
appium driver update <driver-name> --unsafe
# Uninstall a driver (it won't last forever, will it?)
appium driver uninstall <driver-name>
Clients
Client libraries enable writing Appium tests in different programming languages. There are officially-supported clients for Java, Python, Ruby, and .NET C#, as well as third-party clients for other languages. You can find a full list of clients in Appium Ecosystem's Clients page.
Plugins
Plugins allow you to extend server functionality without changing the server code. The main difference between drivers and plugins is that the latter must be explicitly enabled on Appium server startup (all installed drivers are enabled by default):
appium --use-plugins=<plugin-name>
You can find a full list of officially-supported and third-party plugins in Appium Ecosystem's Plugins page.
Similarly to drivers, plugin management is also done using Appium's Extension command-line interface:
# Install an official plugin from npm (see documentation for a list of such plugins)
appium plugin install <plugin-name>
# Install any plugin from npm
appium plugin install --source=npm <plugin-name>
# See documentation for installation from other sources
# List already installed plugins
appium plugin list --installed
# Update a plugin (it must be already installed)
# This will NOT update the major version, in order to prevent breaking changes
appium plugin update <plugin-name>
# Update a plugin to the most recent version (may include breaking changes)
appium plugin update <plugin-name> --unsafe
# Uninstall a plugin
appium plugin uninstall <plugin-name>
Server Command Line Interface
In order to start sending commands to the Appium server, it must be running on the URL and port where your client library expects it to listen. Appium's command-line interface is used to launch and configure the server:
# Start the server on the default host (0.0.0.0) and port (4723)
appium server
# You can also omit the 'server' subcommand
appium
# Start the server on the given host, port and use a custom base path prefix (the default prefix is '/')
appium --address 127.0.0.1 --port 9000 --base-path /wd/hub
Appium supports execution of parallel server processes, as well as parallel driver sessions within a single server process. Refer the corresponding driver documentations regarding which mode is optimal for the particular driver or whether it supports parallel sessions.
Why Appium?
- You usually don't have to recompile your app or modify it in any way, due to the use of standard automation APIs on all platforms.
- You can write tests with your favorite dev tools using any WebDriver-compatible language such as Java, Python, Ruby and C#. There are also third party client implementations for other languages.
- You can use any testing framework.
- Some drivers like
xcuitestanduiautomator2have built-in mobile web and hybrid app support. Within the same script, you can switch seamlessly between native app automation and webview automation, all using the WebDriver model that's already the standard for web automation. - You can run your automated tests locally and in a cloud. There are multiple cloud providers that support various Appium drivers (mostly targeting iOS and Android mobile automation).
- Appium Inspector can be used to visually inspect the page source of applications across different platforms, facilitating easier test development.
Investing in the WebDriver protocol means you are betting on a single, free, and open protocol for testing that has become a web standard. Don't lock yourself into a proprietary stack.
For example, if you use Apple's XCUITest library without Appium, you can only write tests using Obj-C/Swift, and you can only run tests through Xcode. Similarly, with Google's UiAutomator or Espresso, you can only write tests in Java/Kotlin. Appium opens up the possibility of true cross-platform native app automation, for mobile and beyond!
If you are looking for a more comprehensive description of what this is all about, please read our documentation on How Does Appium Work?.
Sponsors
Appium has a Sponsorship Program! If you or your company uses Appium and wants to give back financially to the project, we use these funds to encourage development and contributions, as well as support other open source projects we rely on. Become a sponsor via our OpenCollective page.
Development and Strategic Partners
Appium is incredibly grateful to our Development and Strategic Partners for their sustained contribution of project development and leadership!
Other Sponsors
A full list of sponsors is available at our Sponsors page.
License
@appium/logger package is under ISC License.