with one click
appium-parallel-grid
// Selenium Grid 4 relay with Appium for multi-device parallel execution and device farm management
// Selenium Grid 4 relay with Appium for multi-device parallel execution and device farm management
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | appium-parallel-grid |
| description | Selenium Grid 4 relay with Appium for multi-device parallel execution and device farm management |
| tech_stack | ["appium","mobile-native"] |
| language | ["java","bash"] |
| capability | ["e2e-testing","ci-cd"] |
| version | Appium 2.x with Selenium Grid 4 |
| collected_at | "2025-07-16T00:00:00.000Z" |
Source: https://appium.io/docs/en/2.0/guides/grid/, https://appium.readthedocs.io/en/stable/en/advanced-concepts/parallel-tests/, https://github.com/AppiumTestDistribution/appium-device-farm
Run Appium tests in parallel across multiple devices using Selenium Grid 4 relay, single-server multi-session isolation, or the Appium Device Farm plugin — with correct port isolation and capability matching.
2+ Appium servers → 2+ Grid nodes → 1 Grid hub → single endpoint :4444
# 1. Appium servers with unique ports
appium --config appium1.yml # port 4723
appium --config appium2.yml # port 4733
# 2. Grid nodes (one per Appium server)
java -jar selenium.jar node --config node1.toml
java -jar selenium.jar node --config node2.toml
# 3. Grid hub
java -jar selenium.jar hub
# 4. All traffic → http://localhost:4444
Just start Appium on any port and pass unique isolation capabilities per session:
Android:
udid=<device1>, systemPort=8200, chromeDriverPort=9515
udid=<device2>, systemPort=8201, chromeDriverPort=9516
iOS:
udid=<device1>, wdaLocalPort=8100
udid=<device2>, wdaLocalPort=8101
[server]
port = 5555
[node]
detect-drivers = false
[relay]
url = "http://localhost:4723"
status-endpoint = "/status"
configs = [
"1", # maxSessions
"{\"platformName\": \"iOS\", \"appium:automationName\": \"XCUITest\", ...}"
]
configs array: pairs of [maxSessions, capabilityJSON] — exact string match requireddetect-drivers = false is mandatory for relay modeserver:
port: 4723
use-drivers: [xcuitest]
default-capabilities:
wdaLocalPort: 8100
mjpegServerPort: 9100
Key: every Appium server needs unique port, wdaLocalPort, mjpegServerPort.
{
"capabilities": [{"browserName": "iPhone5", "version": "7.1", "maxInstances": 1, "platform": "MAC"}],
"configuration": {
"url": "http://<host>:<port>/wd/hub",
"maxSession": 1, "register": true,
"hubPort": 4444, "hubHost": "<grid_ip>"
}
}
Start: appium server --nodeconfig nodeconfig.json --base-path=/wd/hub
| Platform | Capability | Default | Purpose |
|---|---|---|---|
| Android | udid | — | Unique device ID |
| Android | systemPort | 8200 | uiautomator2 port |
| Android | chromeDriverPort | — | Chromedriver port |
| iOS Real | udid | — | Unique device ID |
| iOS Real | wdaLocalPort | 8100 | WebDriverAgent port |
| iOS Real | webkitDebugProxyPort | 27753 | Safari debug proxy |
| iOS Sim | udid | — | Simulator UDID |
| iOS Sim | wdaLocalPort | 8100 | WebDriverAgent port |
wdaLocalPort, systemPort, chromeDriverPort, or webkitDebugProxyPort causes silent crashes.localhost/127.0.0.1 in host/url prevents cross-machine Grid connections.configs JSON string./status before dispatching testshttp://<host>:<port>/device-farm provides real-time session monitoringwda-resign_tvos.ipa and use "appium:platformName": "tvOS"