Appium 并发和主从远程控制

来源:互联网 发布:mac宽带连接鉴定失败 编辑:程序博客网 时间:2024/05/22 05:01

 最近有人在群里问并发的问题,我就把我的经验写下来供大家参考,我的这些方法其实都是从社区里的帖子找到的,没有什么新鲜的,但是有群友说还是分享一下更好;
主要参考如下帖子和回复
Appium 主从远程控制执行

连接 2 个设备测试的时候每次都只运行一个设备?

Appium Android ——利用 TestNG 并行执行用例

并发时要启动多个服务,所以端口号要不同,可以通过GUI和命令行两种方式启动多个服务并修改端口号
GUI只要点击多次就可以启动多个服务,
如下第一、第二步选取一种就可以了

1.GUI更改各种端口号
(1)更改服务端的ip和端口号,把ip改为服务端的ip,不要用127.0.0.1,要不然远程的时候,客户端连不上

(2)更改其他端口号,需要哪个就要更改哪个

2.命令行更改端口号
我的Appium是装的GUI的,但是也可以通过命令行调。
需要把Appium的相关路径加到环境变量里,路径如下
C:\Appium\node_modules.bin

命令类似如下:
appium -p 4492 -bp 2251 --selendroid-port 65222

具体见如下网址:
https://github.com/appium/appium/blob/master/docs/cn/appium-setup/parallel_tests.cn.md

3.代码的修改
(1)Android的配置里记得加上desired_caps['udid'] 这项,内容与deviceNme一致,通过adb devices查询到的,这样能保证找到手机

(2)http://192.168.11.11:4723/wd/hub

这项配置要改成你要连接的服务端的IP和端口号

我的各种配置都是通过读配置文件来完成配置的,大家可以参考

<span class="k" style="color:rgb(170,34,255); font-weight:bold">def</span> <span class="nf" style="color:rgb(0,160,0)">setUp</span><span class="p">(</span><span class="bp" style="color:rgb(170,34,255)">self</span><span class="p">):</span>        <span class="n">desired_caps</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="p">{}</span>        <span class="n">desired_caps</span><span class="p">[</span><span class="s" style="color:rgb(187,68,68)">'platformName'</span><span class="p">]</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">ini_file</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">get</span><span class="p">(</span><span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">mobile_phone</span><span class="p">,</span><span class="s" style="color:rgb(187,68,68)">'OS_type'</span><span class="p">)</span> <span class="c" style="color:rgb(176,178,176); font-style:italic">#测试手机的系统类型</span>        <span class="n">desired_caps</span><span class="p">[</span><span class="s" style="color:rgb(187,68,68)">'platformVersion'</span><span class="p">]</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">ini_file</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">get</span><span class="p">(</span><span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">mobile_phone</span><span class="p">,</span><span class="s" style="color:rgb(187,68,68)">'OS_version'</span><span class="p">)</span> <span class="c" style="color:rgb(176,178,176); font-style:italic">#该手机系统的版本号</span>        <span class="n">desired_caps</span><span class="p">[</span><span class="s" style="color:rgb(187,68,68)">'deviceName'</span><span class="p">]</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">ini_file</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">get</span><span class="p">(</span><span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">mobile_phone</span><span class="p">,</span><span class="s" style="color:rgb(187,68,68)">'deviceName'</span><span class="p">)</span> <span class="c" style="color:rgb(176,178,176); font-style:italic">#该手机的deviceName,Android请用adb devices查询</span>        <span class="n">desired_caps</span><span class="p">[</span><span class="s" style="color:rgb(187,68,68)">'app'</span><span class="p">]</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">ini_file</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">get</span><span class="p">(</span><span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">mobile_phone</span><span class="p">,</span><span class="s" style="color:rgb(187,68,68)">'app'</span><span class="p">)</span> <span class="c" style="color:rgb(176,178,176); font-style:italic">#本地apk或者ipa的绝对路径,如果iPhone上安装了app,则为bundle ID</span>        <span class="n">desired_caps</span><span class="p">[</span><span class="s" style="color:rgb(187,68,68)">'udid'</span><span class="p">]</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">ini_file</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">get</span><span class="p">(</span><span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">mobile_phone</span><span class="p">,</span><span class="s" style="color:rgb(187,68,68)">'udid'</span><span class="p">)</span> <span class="c" style="color:rgb(176,178,176); font-style:italic">#iphone的udid,通过iTunes查找</span>        <span class="n">appium_server_ip</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">ini_file</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">get</span><span class="p">(</span><span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">mobile_phone</span><span class="p">,</span><span class="s" style="color:rgb(187,68,68)">'appium_server_ip'</span><span class="p">)</span>        <span class="n">appium_server_port</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">ini_file</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">get</span><span class="p">(</span><span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">mobile_phone</span><span class="p">,</span><span class="s" style="color:rgb(187,68,68)">'appium_server_port'</span><span class="p">)</span>        <span class="k" style="color:rgb(170,34,255); font-weight:bold">if</span> <span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">os_type</span> <span class="o" style="color:rgb(102,102,102)">==</span> <span class="s" style="color:rgb(187,68,68)">'Android'</span><span class="p">:</span>            <span class="n">desired_caps</span><span class="p">[</span><span class="s" style="color:rgb(187,68,68)">'automationName'</span><span class="p">]</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">ini_file</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">get</span><span class="p">(</span><span class="s" style="color:rgb(187,68,68)">'android_config'</span><span class="p">,</span><span class="s" style="color:rgb(187,68,68)">'automationName'</span><span class="p">)</span> <span class="c" style="color:rgb(176,178,176); font-style:italic">#选择测试引擎</span>            <span class="n">desired_caps</span><span class="p">[</span><span class="s" style="color:rgb(187,68,68)">'appPackage'</span><span class="p">]</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">ini_file</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">get</span><span class="p">(</span><span class="s" style="color:rgb(187,68,68)">'android_config'</span><span class="p">,</span><span class="s" style="color:rgb(187,68,68)">'appPackage'</span><span class="p">)</span> <span class="c" style="color:rgb(176,178,176); font-style:italic">#app的包名,可以咨询开发</span>            <span class="n">desired_caps</span><span class="p">[</span><span class="s" style="color:rgb(187,68,68)">'appActivity'</span><span class="p">]</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">ini_file</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">get</span><span class="p">(</span><span class="s" style="color:rgb(187,68,68)">'android_config'</span><span class="p">,</span><span class="s" style="color:rgb(187,68,68)">'appActivity'</span><span class="p">)</span> <span class="c" style="color:rgb(176,178,176); font-style:italic">#咨询开发</span>            <span class="bp" style="color:rgb(170,34,255)">self</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">driver</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">webdriver</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">Remote</span><span class="p">(</span><span class="s" style="color:rgb(187,68,68)">'http://</span><span class="si" style="color:rgb(187,102,136); font-weight:bold">%</span><span class="s" style="color:rgb(187,68,68)">s:</span><span class="si" style="color:rgb(187,102,136); font-weight:bold">%</span><span class="s" style="color:rgb(187,68,68)">s/wd/hub'</span> <span class="o" style="color:rgb(102,102,102)">%</span> <span class="p">(</span><span class="n">appium_server_ip</span><span class="p">,</span><span class="n">appium_server_port</span><span class="p">),</span> <span class="n">desired_caps</span><span class="p">)</span>            <span class="k" style="color:rgb(170,34,255); font-weight:bold">elif</span> <span class="n">global_list</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">os_type</span> <span class="o" style="color:rgb(102,102,102)">==</span> <span class="s" style="color:rgb(187,68,68)">'IOS'</span><span class="p">:</span>            <span class="bp" style="color:rgb(170,34,255)">self</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">driver</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">webdriver</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">Remote</span><span class="p">(</span>                <span class="n">command_executor</span><span class="o" style="color:rgb(102,102,102)">=</span><span class="s" style="color:rgb(187,68,68)">'http://</span><span class="si" style="color:rgb(187,102,136); font-weight:bold">%</span><span class="s" style="color:rgb(187,68,68)">s:</span><span class="si" style="color:rgb(187,102,136); font-weight:bold">%</span><span class="s" style="color:rgb(187,68,68)">s/wd/hub'</span> <span class="o" style="color:rgb(102,102,102)">%</span> <span class="p">(</span><span class="n">appium_server_ip</span><span class="p">,</span><span class="n">appium_server_port</span><span class="p">),</span>                <span class="n">desired_capabilities</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">desired_caps</span>                <span class="p">)</span>  

配置文件如下,用的ini文件

<span class="p">[</span><span class="n">all_need</span><span class="p">]</span><span class="p">[</span><span class="n">email</span><span class="p">]</span><span class="n">mail_from</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">mail_to</span><span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">smtpserver</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">username</span> <span class="o" style="color:rgb(102,102,102)">=</span><span class="n">password</span> <span class="o" style="color:rgb(102,102,102)">=</span><span class="c" style="color:rgb(176,178,176); font-style:italic">#capabilities</span><span class="p">[</span><span class="n">android_config</span><span class="p">]</span><span class="n">appPackage</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">com</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">ifengxy</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">ifengxycredit</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">ui</span><span class="n">appActivity</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="o" style="color:rgb(102,102,102)">.</span><span class="n">login</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">LoginActivity</span><span class="n">automationName</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">Selendroid</span><span class="c" style="color:rgb(176,178,176); font-style:italic">#capabilities</span><span class="p">[</span><span class="n">ios_config</span><span class="p">]</span><span class="c" style="color:rgb(176,178,176); font-style:italic">#Android app中各种查找元素用id</span><span class="p">[</span><span class="n">android_id</span><span class="p">]</span><span class="n">phone_number_edt</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">phone_number_edt</span><span class="n">password_edt</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">password_edt</span><span class="n">login_btn</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">login_btn</span><span class="c" style="color:rgb(176,178,176); font-style:italic">#IOS app中各种查找元素用id</span><span class="p">[</span><span class="n">ios_id</span><span class="p">]</span><span class="n">phone_number_edt</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">phone_number_edt</span><span class="n">password_edt</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">password_edt</span><span class="n">login_btn</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">login_btn</span><span class="c" style="color:rgb(176,178,176); font-style:italic">#手机的配置</span><span class="p">[</span><span class="n">iphone6</span><span class="p">]</span><span class="n">appium_server_ip</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="mf" style="color:rgb(102,102,102)">192.168</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="mf" style="color:rgb(102,102,102)">11.11</span><span class="n">appium_server_port</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="mi" style="color:rgb(102,102,102)">4723</span><span class="n">OS_type</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">IOS</span><span class="n">OS_version</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="mf" style="color:rgb(102,102,102)">8.3</span><span class="n">deviceName</span> <span class="o" style="color:rgb(102,102,102)">=</span><span class="n">udid</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">d66916b4ae8728a55f2e09e65bff579d43892080</span><span class="n">app</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="p">[</span><span class="n">HUAWEI_MATE7</span><span class="p">]</span><span class="n">appium_server_ip</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="mf" style="color:rgb(102,102,102)">192.168</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="mf" style="color:rgb(102,102,102)">11.11</span><span class="n">appium_server_port</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="mi" style="color:rgb(102,102,102)">4723</span><span class="n">OS_type</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">Android</span><span class="n">OS_version</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="mf" style="color:rgb(102,102,102)">4.4</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="mi" style="color:rgb(102,102,102)">2</span><span class="n">deviceName</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">Y9K0214A14004193</span><span class="n">udid</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">Y9K0214A14004193</span><span class="n">app</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">D</span><span class="p">:</span>\<span class="n">example</span>\<span class="n">test</span>\<span class="n">Credit_enter00003</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">apk</span><span class="p">[</span><span class="n">MEIZU_MX4</span><span class="p">]</span><span class="n">appium_server_ip</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="mf" style="color:rgb(102,102,102)">192.168</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="mf" style="color:rgb(102,102,102)">11.11</span><span class="n">appium_server_port</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="mi" style="color:rgb(102,102,102)">4723</span><span class="n">OS_type</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">Android</span><span class="n">OS_version</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="mf" style="color:rgb(102,102,102)">4.4</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="mi" style="color:rgb(102,102,102)">2</span><span class="n">deviceName</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="mi" style="color:rgb(102,102,102)">750</span><span class="n">ABLDYL593</span><span class="n">udid</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="mi" style="color:rgb(102,102,102)">750</span><span class="n">ABLDYL593</span><span class="n">app</span> <span class="o" style="color:rgb(102,102,102)">=</span> <span class="n">D</span><span class="p">:</span>\<span class="n">example</span>\<span class="n">test</span>\<span class="n">Credit_enter00003</span><span class="o" style="color:rgb(102,102,102)">.</span><span class="n">apk</span>

通过以上配置,在不同的用例里连接不同的端口号就可以启动并发了
------------------------------------------------------------------分割线--------------------------------------------------------分割线-----------------------------------------
4.主从远程控制
(1)在第一步已经把服务端上配置的ip由127.0.0.1改成真正的ip了,如果不改在客户端是连接不上的
在客户端的机器上如果能打开这个连接就表示可以了http://192.168.11.11:4723/wd/hub (记得把IP和端口号改掉)
显示如下文字就是正确的


(2)在客户端的那台机器上安装相应语言的Appium客户端
(3)手机要连接到服务端这台机器上
(4)在客户端上启动测试用例,连接想要的ip和端口
Android:self.driver = webdriver.Remote('http://%s:%s/wd/hub' % (appium_server_ip,appium_server_port), desired_caps) 
0 0