From a2e59992d971d1c338ddacef8d3f48b978bb91d5 Mon Sep 17 00:00:00 2001 From: Andrejs Cunskis Date: Wed, 17 May 2017 10:58:29 +0300 Subject: [PATCH 1/5] Set container ip as default APPIUM_HOST address --- src/app.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/app.py b/src/app.py index 59fcb0d..a4f262a 100644 --- a/src/app.py +++ b/src/app.py @@ -100,12 +100,13 @@ def appium_run(avd_name: str): :param avd_name: Name of android virtual device / emulator """ cmd = 'appium' + local_ip = os.popen('ifconfig eth0 | grep \'inet addr:\' | cut -d: -f2 | awk \'{ print $1}\'').read().strip() grid_connect = str_to_bool(str(os.getenv('CONNECT_TO_GRID', False))) logger.info('Connect to selenium grid? {connect}'.format(connect=grid_connect)) if grid_connect: try: - appium_host = os.getenv('APPIUM_HOST', '127.0.0.1') + 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)) @@ -113,8 +114,8 @@ def appium_run(avd_name: str): cmd += ' --nodeconfig {file}'.format(file=CONFIG_FILE) except ValueError as v_err: logger.error(v_err) - titel = 'Appium Server' - subprocess.check_call('xterm -T "{titel}" -n "{titel}" -e \"{cmd}\"'.format(titel=titel, cmd=cmd), shell=True) + title = 'Appium Server' + subprocess.check_call('xterm -T "{title}" -n "{title}" -e \"{cmd}\"'.format(title=title, cmd=cmd), shell=True) def create_node_config(avd_name: str, appium_host: str, appium_port: int, selenium_host: str, selenium_port: int): From ab45f6bb52f66a1029b1a025af03235f2bd1fffa Mon Sep 17 00:00:00 2001 From: Andrejs Cunskis Date: Tue, 23 May 2017 16:47:41 +0300 Subject: [PATCH 2/5] Support for docker-compose scale and set default browserName --- src/app.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/app.py b/src/app.py index a4f262a..a609c1e 100644 --- a/src/app.py +++ b/src/app.py @@ -110,7 +110,8 @@ def appium_run(avd_name: str): 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)) - create_node_config(avd_name, appium_host, appium_port, selenium_host, selenium_port) + browser_name = os.getenv('BROWSER', 'Chrome') + 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: logger.error(v_err) @@ -118,7 +119,7 @@ def appium_run(avd_name: str): subprocess.check_call('xterm -T "{title}" -n "{title}" -e \"{cmd}\"'.format(title=title, cmd=cmd), shell=True) -def create_node_config(avd_name: str, appium_host: str, appium_port: int, selenium_host: str, selenium_port: int): +def create_node_config(avd_name: str, browser_name: str, appium_host: str, appium_port: int, selenium_host: str, selenium_port: int): """ Create custom node config file in json format to be able to connect with selenium server. @@ -134,7 +135,8 @@ def create_node_config(avd_name: str, appium_host: str, appium_port: int, seleni 'platform': 'Android', 'platformName': 'Android', 'version': ANDROID_VERSION, - 'browserName': avd_name, + 'browserName': browser_name, + 'deviceName': avd_name, 'maxInstances': 1, } ], From 333c2b2a902ff33787d61c281ab9c66d84066714 Mon Sep 17 00:00:00 2001 From: Andrejs Cunskis Date: Tue, 23 May 2017 16:57:53 +0300 Subject: [PATCH 3/5] Fix unit tests --- src/tests/test_appium.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/test_appium.py b/src/tests/test_appium.py index ccc1910..1e9b85e 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', '127.0.0.1', 4723, '127.0.0.1', 4444) + app.create_node_config('test', 'Chrome', '127.0.0.1', 4723, '127.0.0.1', 4444) self.assertTrue(os.path.exists(CONFIG_FILE)) os.remove(CONFIG_FILE) From 5501a2042668497243ab4ef90db2950d918c0edb Mon Sep 17 00:00:00 2001 From: Andrejs Cunskis Date: Wed, 24 May 2017 15:50:34 +0300 Subject: [PATCH 4/5] 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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%0Dw$_v*uWtn>CLM}vwZzj@ozHs7?l zHk<#=oY)U;)7QMS(PRdd^g5#6s?wDS&vU%f^u3>c2Nn1cJo=$#n^vg9YXt`GZRmS4~*2s-Fm_eS>J)FG9??LBX>rbu!&8K)@|C93V z?fuEywrw++?fG)g>f+-S^|Q`0ciSp~-0gkh-Lu6%kC@v{e`UM1r0(fz%k<+u=d|Nz zT#qTu)Z6oB(wckK3Uj~LYZveTzkKKWx#p>P$G@3ej(M|@k%6H>>|x4$;UBNc&C-8v z`gUjk-}+^>KQldNWoBoeX13lp;pypH#ygXB)<=If?zU9}TX$gJ-{PP0{PlL$;dV2x z$CXybeXN&1edqQ16Zb{pXR6=+mijdK?aqI@%$NT;x<2jQzTLt5e{0_?K3#uqp8fCq z$eU%ilKMd<`xb`O`N=qV7u~bYzOmn6UjOr{^ygpK_h?UF z`}bzBwF=ngQ`gk@&)a|J*UgxMI?cE1V<*4g^LJOx8)@s$A9l_Dbn4O1n?L)lgRKkl z>yi&Azr6GFZHe6`>sJ3dv(M)LckArm;vNC2h38E8^FU&m+{)DN^NtsV9cQgfxxT$` zXP#@d`?q)Z=dN_$w*s7gJ{WyJTE9pA{_Vg1nKu7i;=az>`qQP_w!Z!z|MN%O`sYQn zr#-D+8nkcI-UmgO}_?8m|H7y90(-gQ`ne*$FKKq*)?M$z}7FUpGwe5fGzV8=oe_r`p{rUR+ zo#xirEQaDU?C3e`#_)+p4EuY`&ir-?nY7uDaFD=b5K($xH%OJR6qStk2P$Dfia@ z{ezTKwo66&c7NQsd1>+N)5QtjYo^)SO>f^{9zQET5Fvjg{@Y&_1NQoeZRU;nwKpY~aU${yzIz*Ba@&UatFlK1`lLHldZ z*Yc&+8A>bjJ(pgX`*87{xT`C8Qwxd|l%@N{j*A4{vY7SpV(&{$Is3lKx@_@fI}Zpq zfI_XJFm6_kre+EMQmcKI%ugS2s#%n6`!dUT*QVbq)8tm4Ph0l!{LeGr_WM5kwfXb2 z*YUICt8YvGe80ak)$U9C>LS07`Il?5(w}{wGws;F&BpZ!xzqGt*X*+g733d`wrCu` zSi=8h`Ra0=t5x;Cx;@&^tYK z_aipP%N}iAuTzrx{@>lmeK|)zmRr4jARE5^)t(&2>mZXK9IeXSv~)?tJHJg6N?zW$ zd1>~wy{e1v|EO8^tSs&Sn|oW{*BISjTW`Pr;%=+(e;>Z3oKL=K|NVRBIs1vJ?0%=; z+_9XQz3$w)yLT^m@7S%d$UfE-bY(n{&3c zSMrsurTWJ?CuYb0udYl#pYiS8{n|UF%eU?~dcX4>_sxQbXP2kwfs*m`y{dC`_kO&3 z{aN~{sU>>$+WqyvPyRV^$MxsreSI-I-<`hs{mJxA`~N+CvQquhw)Dz*H>SS1R~{#K zzcy^vY4atI@0jYp%mJspwxgQAm(1DsuP7_|>Xl&s(h{4e|Nc$s+gWF|Sb6IdcDBCF z&z4^N*|jzDTG8M(%sFWy@CEznix{Jrlm?mxwAxnv{%XOP|hw?B89*Xe;uUe8I}V?REO+4D=?@23wa`RSK?TSiBfew&rEtIXhi z)c4Cj{j5I6XRSYFK7WtG@9+|}v!*vM?=iW5zW?dN*r{)R{Of;mb*c2HU8k?5Ro>Q= z1eLxSg`fu1N`2t_{=MQr9fzKtAHZS!_FJ3ysY2k!-_y4t@soP|K)Jd^*-b0^ft*PFt zudg|Ge*eSVpRJ$vp9@_ofBN6w{4;m%SYO(>Nk2QTw$|)R%=FXuH|U-IQUglA&lj$} znPb-f^%=8uy7-=ps;jO2PdR{M%=>82NjJG0mbWL}JRS7&FGxu2u=mtnoku6({oDhe zY0`(KsFVCwJ$o^G*|~XZ)`FZ|F>|6WDA;s*CJ$7P9N9M)>-L!IN8YVm^$g^=2kbrI z#_oeB#gugUkuAU#AK*a_y>9{_YeD!xrzJ5X4*DD3Y}OZUuAg==I?eB$iT={J-=FiZ z|Gk+f=IhIv#5DJ9G2b8FsrsJ84=Sxe<}z?!zm{V*TmQx6-koQbD$BM`wz=q?;{WyX zPxJacTKlV?mujlsG`{U&#ci3pksZ`>1nFvEweq`}ZubARto+%#`Tvjpc~@=4zwgS8 zdC~X3+iMetZ*1P))abG^>YmkJ@AoO1?=R1_+N2zv_ao-nz1qre*Oq-c z@$Kdn?(EO&`1hM$&)aX@yuYr#%;wU(&w4Sl%kR~tF1u$qZRf+;pZ{flOMR6*|MZEq z)|6=sj_i1GL``DRP-}Rr{-@BpY3vQT#ydEdk_gP~7xtQPILTCP3om=@UF}C{M zUVCBf>r21S`lfvC?dfLuUq0J%c5Cead31L1>*@C<&(@!H>cj#cDU{^VenQY(F0}kH7D~ z*S4Phy072;t@-yQdGpCLE^c+T(P4kjRTsUUes6lTeXVcU9kXfn>&+%@Nq2o_ROs)1 z@9V|+XW!rZId9MFJ-I)R94}Y7erJOHkGWeTH~u?S^WfaRFLIR!-^QO_yWe~^uY7HM z-rmp8Ki%uzwzMpN(iTu77UWrmX_FpLshyORT6-;b?wRoPNh$IBeum#an>qDsuHnE zq&&)g`*L5^)y?ayChuNdyz|Gh)0VNmw#^fIo|6sR)y)I zmV2-3pTBnN+~N8AejNL>@KbM=K-7odHtN4=g+UiN)*6e(_DyH%t zXPqh7*$fN}5iG~;_oZFk^(F3aeNlR;nSJHu9mcBoA?#$b$sl4GT^@Z;j&%A9q)%{xhJl^p4=ViC&o{vej<9{19d*9dd`(D&M zD_eW!WxAYU)WQjUD#n{Xd#1a0xv$ZicXQtIZRgYdttM?rKYFUQey_^R*|{p|^JexP zUO#8v=dhb-vu`S*ydJZ~6K==+-V>;qPajKh!?8bIXS}{%d@W&-`4Oa(&<7 z$8TrOJ*)g#R9XLwH7fn-rzJ1%Dl6wV*Tf1%9K$0M=Qn<-~Qp&Qb^nYKbowTvpZ=)Sn z_Ush@9^LnAW&Tb~1t|gH4G~k2>PDUDH=qg=B*DVNjKiOfPao~8XDlRaJi KT-G@yGywofl^^8* 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) From 7170ee20d4878e88fa0628a51f647235bc514085 Mon Sep 17 00:00:00 2001 From: Andrejs Cunskis Date: Wed, 24 May 2017 17:00:29 +0300 Subject: [PATCH 5/5] Fix method name and build 6.0 without google_apis --- release.sh | 5 +---- src/app.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/release.sh b/release.sh index c6f8237..beba2be 100755 --- a/release.sh +++ b/release.sh @@ -111,12 +111,9 @@ function build() { for v in "${versions[@]}"; do # Find image type and default web browser - if [ "$v" == "5.0.1" ] || [ "$v" == "5.1.1" ]; then + if [ "$v" == "5.0.1" ] || [ "$v" == "5.1.1" ] || [ "$v" == "6.0" ]; then IMG_TYPE=android BROWSER=browser - elif [ "$v" == "6.0" ]; then - IMG_TYPE=google_apis - BROWSER=browser else IMG_TYPE=google_apis BROWSER=chrome diff --git a/src/app.py b/src/app.py index 7b45ea3..6553598 100644 --- a/src/app.py +++ b/src/app.py @@ -106,7 +106,7 @@ 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))) + mobile_web_test = convert_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))