From 5501a2042668497243ab4ef90db2950d918c0edb Mon Sep 17 00:00:00 2001 From: Andrejs Cunskis Date: Wed, 24 May 2017 15:50:34 +0300 Subject: [PATCH] Set default browser, mobile web test parameter and docker compose example --- README.md | 6 ++++++ docker/Emulator_arm | 4 +++- docker/Emulator_x86 | 4 +++- example/compose/README.md | 16 +++++++++++++++ example/compose/docker-compose.yml | 31 +++++++++++++++++++++++++++++ images/compose_selenium_grid.png | Bin 0 -> 50527 bytes release.sh | 11 +++++++--- src/app.py | 4 +++- src/tests/test_appium.py | 2 +- 9 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 example/compose/README.md create mode 100644 example/compose/docker-compose.yml create mode 100644 images/compose_selenium_grid.png diff --git a/README.md b/README.md index eefc6f4..651878f 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,12 @@ It is also possible to connect appium server that run inside docker-android with docker run --privileged -d -p 6080:6080 -p 4723:4723 -p 5554:5554 -p 5555:5555 -e DEVICE="Samsung Galaxy S6" -e APPIUM=True -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 --name android-container butomo1989/docker-android-x86-7.1.1 ``` +To run tests for mobile browser, following parameter can be passed: + +- MOBILE\_WEB\_TEST=True + +Check [README.md](/example/compose/README.md) on how to run complete selenium grid using docker-compose + ### Share Volume If you want to use appium to test UI of your android application, you need to share volume where the APK is located to folder ***/root/tmp***. diff --git a/docker/Emulator_arm b/docker/Emulator_arm index cc459f8..6fee916 100644 --- a/docker/Emulator_arm +++ b/docker/Emulator_arm @@ -110,12 +110,14 @@ ARG API_LEVEL=21 ARG PROCESSOR=x86 ARG SYS_IMG=x86_64 ARG IMG_TYPE=google_apis +ARG BROWSER=android ENV ANDROID_VERSION=$ANDROID_VERSION \ BUILD_TOOL=$BUILD_TOOL \ API_LEVEL=$API_LEVEL \ PROCESSOR=$PROCESSOR \ SYS_IMG=$SYS_IMG \ - IMG_TYPE=$IMG_TYPE + IMG_TYPE=$IMG_TYPE \ + BROWSER=$BROWSER RUN echo y | android update sdk --no-ui -a --filter build-tools-${BUILD_TOOL} ENV PATH ${PATH}:${ANDROID_HOME}/build-tools diff --git a/docker/Emulator_x86 b/docker/Emulator_x86 index 8b70015..b5291f9 100644 --- a/docker/Emulator_x86 +++ b/docker/Emulator_x86 @@ -123,12 +123,14 @@ ARG API_LEVEL=21 ARG PROCESSOR=x86 ARG SYS_IMG=x86_64 ARG IMG_TYPE=google_apis +ARG BROWSER=android ENV ANDROID_VERSION=$ANDROID_VERSION \ BUILD_TOOL=$BUILD_TOOL \ API_LEVEL=$API_LEVEL \ PROCESSOR=$PROCESSOR \ SYS_IMG=$SYS_IMG \ - IMG_TYPE=$IMG_TYPE + IMG_TYPE=$IMG_TYPE \ + BROWSER=$BROWSER RUN echo y | android update sdk --no-ui -a --filter build-tools-${BUILD_TOOL} ENV PATH ${PATH}:${ANDROID_HOME}/build-tools diff --git a/example/compose/README.md b/example/compose/README.md new file mode 100644 index 0000000..e258264 --- /dev/null +++ b/example/compose/README.md @@ -0,0 +1,16 @@ +[docker-compose.yml](/example/compose/docker-compose.yml) file for setting up selenium grid. +----------------------------------------------------- + +Example compose file which can be used to set up selenium grid hub with emulator nodes connected to it +![](/images/compose_selenium_grid.png) + +Requirements +============ +docker-compose +for `scale:` option docker-compose v1.13.0 and newer is required + +Quick Start +=========== +```bash +docker-compose up +``` diff --git a/example/compose/docker-compose.yml b/example/compose/docker-compose.yml new file mode 100644 index 0000000..dfdc33e --- /dev/null +++ b/example/compose/docker-compose.yml @@ -0,0 +1,31 @@ +version: "2.2" +services: + hub: + image: selenium/hub:3.4.0 + ports: + - "4444:4444" + + node_samsung_7.1.1: + image: butomo1989/docker-android-x86-7.1.1 + privileged: true + scale: 2 + ports: + - 6080 + environment: + - DEVICE=Samsung Galaxy S6 + - CONNECT_TO_GRID=True + - APPIUM=true + - SELENIUM_HOST=hub + + node_nexus_web_7.1.1: + image: butomo1989/docker-android-x86-7.1.1 + privileged: true + scale: 2 + ports: + - 6080 + environment: + - DEVICE=Nexus 5 + - CONNECT_TO_GRID=True + - APPIUM=true + - SELENIUM_HOST=hub + - MOBILE_WEB_TEST=True diff --git a/images/compose_selenium_grid.png b/images/compose_selenium_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..f078b611d68afc3deb91ad415bed10198dc881b1 GIT binary patch literal 50527 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≫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 XzM{DXQ1c8wrmUu-rCj*%<@^5uNtGYv literal 0 HcmV?d00001 diff --git a/release.sh b/release.sh index c709bb6..c6f8237 100755 --- a/release.sh +++ b/release.sh @@ -110,11 +110,16 @@ function build() { fi for v in "${versions[@]}"; do - # Find image type + # Find image type and default web browser if [ "$v" == "5.0.1" ] || [ "$v" == "5.1.1" ]; then IMG_TYPE=android + BROWSER=browser + elif [ "$v" == "6.0" ]; then + IMG_TYPE=google_apis + BROWSER=browser else IMG_TYPE=google_apis + BROWSER=chrome fi echo "[BUILD] IMAGE TYPE: $IMG_TYPE" level=${list_of_levels[$v]} @@ -127,10 +132,10 @@ function build() { echo "[BUILD] Dockerfile: $FILE_NAME" docker build -t $image_version --build-arg ANDROID_VERSION=$v --build-arg BUILD_TOOL=$LATEST_BUILD_TOOL \ --build-arg API_LEVEL=$level --build-arg PROCESSOR=$p --build-arg SYS_IMG=$sys_img \ - --build-arg IMG_TYPE=$IMG_TYPE -f $FILE_NAME . + --build-arg IMG_TYPE=$IMG_TYPE --build-arg BROWSER=$BROWSER -f $FILE_NAME . docker build -t $image_latest --build-arg ANDROID_VERSION=$v --build-arg BUILD_TOOL=$LATEST_BUILD_TOOL \ --build-arg API_LEVEL=$level --build-arg PROCESSOR=$p --build-arg SYS_IMG=$sys_img \ - --build-arg IMG_TYPE=$IMG_TYPE -f $FILE_NAME . + --build-arg IMG_TYPE=$IMG_TYPE --build-arg BROWSER=$BROWSER -f $FILE_NAME . done done } diff --git a/src/app.py b/src/app.py index a609c1e..1d4c927 100644 --- a/src/app.py +++ b/src/app.py @@ -106,11 +106,13 @@ def appium_run(avd_name: str): logger.info('Connect to selenium grid? {connect}'.format(connect=grid_connect)) if grid_connect: try: + mobile_web_test = str_to_bool(str(os.getenv('MOBILE_WEB_TEST', False))) + default_web_browser = os.getenv('BROWSER') appium_host = os.getenv('APPIUM_HOST', local_ip) appium_port = int(os.getenv('APPIUM_PORT', 4723)) selenium_host = os.getenv('SELENIUM_HOST', '172.17.0.1') selenium_port = int(os.getenv('SELENIUM_PORT', 4444)) - browser_name = os.getenv('BROWSER', 'Chrome') + browser_name = default_web_browser if mobile_web_test else 'android' create_node_config(avd_name, browser_name, appium_host, appium_port, selenium_host, selenium_port) cmd += ' --nodeconfig {file}'.format(file=CONFIG_FILE) except ValueError as v_err: diff --git a/src/tests/test_appium.py b/src/tests/test_appium.py index 1e9b85e..9579bc0 100644 --- a/src/tests/test_appium.py +++ b/src/tests/test_appium.py @@ -44,7 +44,7 @@ class TestAppium(TestCase): def test_config_creation(self): from src import CONFIG_FILE self.assertFalse(os.path.exists(CONFIG_FILE)) - app.create_node_config('test', 'Chrome', '127.0.0.1', 4723, '127.0.0.1', 4444) + app.create_node_config('test', 'android', '127.0.0.1', 4723, '127.0.0.1', 4444) self.assertTrue(os.path.exists(CONFIG_FILE)) os.remove(CONFIG_FILE)