$ docker build -t "appium/appium:local" -f Appium/Dockerfile Appium
Connect Android device to the machine via USB
Run Appium-Docker-Android
$ docker run --privileged -d -p 4723:4723 -v /dev/bus/usb:/dev/bus/usb --name appium-container appium/appium
OR you can get the id of the device via this command ls -l /dev/serial/by-id
and pass the device-id to container to have more security
docker run --privileged -d -p 4723:4723 --device=/dev/<your-device-id> --name appium-container appium/appium
Run following command to verify adb devices can detect the connected android device.
$ docker exec -it appium-container adb devices
On Windows OS, you need to specify the host to host.docker.internal
$ docker exec -it appium-container adb -H host.docker.internal devices
Run UI Test with following test configuration
Push the apk file into the container
$ docker cp /home/myuser/localfolder/app-debug.apk appium-container:/home/androidusr/sample.apk
Desired Capabilities:
private void androidSetup() throws MalformedURLException {
caps.setCapability("deviceName", "Android");
caps.setCapability("app", "/home/androidusr/sample.apk");
//Get the IP Address of boot2docker
//docker inspect $(docker ps -q) | grep IPA
driver = new AndroidDriver<MobileElement>(new URL("http://xx.xx.xx.xx:4723/wd/hub"), caps);
}
On Windows OS, you need to set the capability appium:remoteAdbHost
to host.docker.internal
. This capability is supported by various drivers: UiAutomator2, Espresso, Flutter.
Each time, you will (re)create container, connected to container devices will ask for authorization after first connection. To prevent that, you can share one identity through all created containers. To do that, you should:
adb devices
-v ~/.android:/home/androidusr/.android
For example:
$ docker run --privileged -d -p 4723:4723 -v ~/.android:/home/androidusr/.android -v /dev/bus/usb:/dev/bus/usb --name appium-container appium/appium
In certain use cases you may want to have a single Appium-Docker-Android container running for each device. To achieve this you must run adb kill-server
and then provide the --device
option to docker run
:
$ docker run -d -p 4723:4723 --device /dev/bus/usb/XXX/YYY:/dev/bus/usb/XXX/YYY -v ~/.android:/root/.android --name device1 appium/appium
$ docker run -d -p 4724:4723 --device /dev/bus/usb/XXX/ZZZ:/dev/bus/usb/XXX/ZZZ -v ~/.android:/root/.android --name device2 appium/appium
Appium-Docker-Android can be connected with Android devices by Air.
To do that you need to configure android device, according to official manual
Then run docker container with following parameters:
$ docker run -d -p 4723:4723 -e REMOTE_ADB=true -e ANDROID_DEVICES=192.168.0.5:5555,192.168.0.6:5555 -e REMOTE_ADB_POLLING_SEC=60
APPIUM_ADDITIONAL_PARAMS="--relaxed-security --allow-insecure chromedriver_autodownload --allow-insecure adb_shell
Appium-Docker-Android can be connected with selenium grid by passing following parameters:
$ docker run --privileged -d -p 4723:4723 -e CONNECT_TO_GRID=true -e APPIUM_HOST="127.0.0.1" -e APPIUM_PORT=4723 -e SELENIUM_HOST="172.17.0.1" -e SELENIUM_PORT=4444 -v /dev/bus/usb:/dev/bus/usb --name appium-container appium/appium
The image generates the node config file, if you would like to provide your own config pass the following parameters:
There is an example of compose file to simulate the connection between selenium hub and appium server with connected device(s) in docker solution.
$ docker-compose up -d