在TesterHome挺久了,一般是看帖比较少发,
最近有看到一些同学做多设备的Appium测试有碰到一些问题。
刚好自己前段也涉及到类似的方案,在这里分享些自己这段碰到的一些问题阻碍,和解决的一些思路吧,刚涉及UI自动化不久,很多东西还很生疏,欢迎大家提点。
1.需求和条件制约
最早需求的提出,场景的要求是要同时实现几十台设备的UI自动化测试且是有客户端的交互行为,部分设备运行的APP需要等待其他设备的APP进行操作。
APP是Hybrid类型的,内嵌了webview,且该webview是自定义过的,robutim是无法识别到控件,尝试过录制器也无法用,而尝试了appium则是可以使用的因为是chromedriver控制的。
设备数量大概是在60左右,要求持续运行较久的时间,那么设备需要持续USB供电,就不能直接连PC跑脚本(PS:PC也没那么多口接这么多设备)
那么需求就清晰了:用appium在同个用例里进行60台设备的UI自动化控制。
2.方案实施
1. 首先因为无法USB连接,这里全部都使用无线ADB连接,之前有同学写过使用无线adb工具进行连接的文章,其实只要有root权限,一个命令就可以搞定了。
在cmd运行adb tcpip 5555,可以启动5555端口的监听,如果需要切换回usb则运行adb usb
之后通过adb connect IP 进行设备的无线调试连接,adb disconnect IP来断开连接
2.然后开始多设备时的Appium Server控制,因为Appium Server与设备要一一对应,所以需要启动较多的server,所以肯定不选择windows版本的server控制,因为启动需要手动去点击,出现问题也无法重新启动。
那么就使用命令行模式的(PS:部分同学因为被墙的原因无法npm进行安装,这里有个小技巧,可以帮助你们装完windows版的appium server后依然可以使用命令行的:传送门)
设计AppiumServer类来进行Server的批量启动控制如下。
<span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">class</span> <span class="nc" style="color: blue;">AppiumServer</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
<span class="n">LogUtil</span> <span class="n">log</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">LogUtil</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
<span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="n">AppiumServer</span><span class="o" style="color: rgb(102, 102, 102);">(){</span>
<span class="n">KillTask</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"node.exe"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="n">log</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">info</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"init appium server..."</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span>
<span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">void</span> <span class="n">KillTask</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">String</span> <span class="n">taskname</span><span class="o" style="color: rgb(102, 102, 102);">){</span>
<span class="n">String</span> <span class="n">Command</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="s" style="color: rgb(187, 68, 68);">"taskkill /F /im "</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">taskname</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="n">log</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">info</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"kill "</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">taskname</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="s" style="color: rgb(187, 68, 68);">" task ..."</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="n">runCommand</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">Command</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span>
<span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">void</span> <span class="n">runServer</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">int</span> <span class="n">port</span><span class="o" style="color: rgb(102, 102, 102);">,</span><span class="n">String</span> <span class="n">udid</span><span class="o" style="color: rgb(102, 102, 102);">)</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
<span class="n">log</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">info</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"run "</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="s" style="color: rgb(187, 68, 68);">" Appium Server in port "</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">port</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="s" style="color: rgb(187, 68, 68);">"..."</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">int</span> <span class="n">bpport</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">port</span> <span class="o" style="color: rgb(102, 102, 102);">+</span><span class="mi" style="color: rgb(102, 102, 102);">1</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">int</span> <span class="n">chromeport</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">port</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="mi" style="color: rgb(102, 102, 102);">4792</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="c1" style="color: rgb(176, 178, 176); font-style: italic;">//多设备server端需要手动指定每台设备的udid,安卓无线连接下就是设备的ip:port..</span>
<span class="n">String</span> <span class="n">Command</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="s" style="color: rgb(187, 68, 68);">"appium.cmd -p "</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">port</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="s" style="color: rgb(187, 68, 68);">" -bp "</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">bpport</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="s" style="color: rgb(187, 68, 68);">" --session-override --chromedriver-port "</span><span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">chromeport</span> <span class="o" style="color: rgb(102, 102, 102);">+</span><span class="s" style="color: rgb(187, 68, 68);">" -U "</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="s" style="color: rgb(187, 68, 68);">" >c://"</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">port</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="s" style="color: rgb(187, 68, 68);">".txt"</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="n">log</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">info</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">Command</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="n">runCommand</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">Command</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span>
<span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">private</span> <span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">void</span> <span class="n">runCommand</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">String</span> <span class="n">command</span><span class="o" style="color: rgb(102, 102, 102);">){</span>
<span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">try</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
<span class="n">Runtime</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">getRuntime</span><span class="o" style="color: rgb(102, 102, 102);">().</span><span class="na" style="color: rgb(187, 68, 68);">exec</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">command</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span> <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">catch</span> <span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">IOException</span> <span class="n">e</span><span class="o" style="color: rgb(102, 102, 102);">)</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
<span class="n">e</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">printStackTrace</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span>
启动server
<span class="n">AppiumServer</span> <span class="n">AS</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">AppiumServer</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
<span class="n">AS</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">runServer</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="mi" style="color: rgb(102, 102, 102);">4723</span><span class="o" style="color: rgb(102, 102, 102);">,</span> <span class="s" style="color: rgb(187, 68, 68);">"192.168.1.17:5555"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
3.对于同时启动大量的AppiumServer运行webview的测试,在实际运行时,出现问题了,当启动的设备超过十几台时候,adb的进程数会达到几十个,数量达到一定程度后,adb会停止响应并结束进程断开所有设备,而且webview进行测试的时候会需要启动chromedriver进程,与设备也是一一对应,启动超过十几个进程并行执行,也会出现很多不稳定的不识别或者停止响应的情况。
针对这个问题,其实原因还是windows下的adb太脆弱了,结合Appium的Server支持远程执行的情况,搭建多台Linux环境的PC来做Appium Server端的运行执行(最后实际测试linux下同时可以承载30+台设备妥妥的),Server的启动控制使用STAF进行控制。(PS:STAF环境搭建之后再整理份,不过百度下应该挺多)
搭建好STAF环境后,导入JSTAF.jar并增加staf的运行控制方法如下
<span class="kn" style="color: rgb(170, 34, 255); font-weight: bold;">import</span> <span class="nn" style="color: rgb(0, 0, 255); font-weight: bold;">com.ibm.staf.STAFException</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="kn" style="color: rgb(170, 34, 255); font-weight: bold;">import</span> <span class="nn" style="color: rgb(0, 0, 255); font-weight: bold;">com.ibm.staf.STAFHandle</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="o" style="color: rgb(102, 102, 102);">......</span>
<span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">private</span> <span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">void</span> <span class="n">runRemoteCommand</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">String</span> <span class="n">command</span><span class="o" style="color: rgb(102, 102, 102);">){</span>
<span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">try</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
<span class="n">handle</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">new</span> <span class="n">STAFHandle</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"MySTAF"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span> <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">catch</span> <span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">STAFException</span> <span class="n">e</span><span class="o" style="color: rgb(102, 102, 102);">)</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
<span class="n">System</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">out</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">println</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"Error registering with STAF, RC: "</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">e</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">rc</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span>
<span class="n">String</span> <span class="n">service</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="s" style="color: rgb(187, 68, 68);">"PROCESS"</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="n">String</span> <span class="n">request</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="s" style="color: rgb(187, 68, 68);">"start command shell \""</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">command</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="s" style="color: rgb(187, 68, 68);">"\""</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">try</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
<span class="n">handle</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">submit2</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">ServerIP</span><span class="o" style="color: rgb(102, 102, 102);">,</span> <span class="n">service</span><span class="o" style="color: rgb(102, 102, 102);">,</span> <span class="n">request</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="n">handle</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">unRegister</span><span class="o" style="color: rgb(102, 102, 102);">();</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span> <span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">catch</span> <span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">STAFException</span> <span class="n">e</span><span class="o" style="color: rgb(102, 102, 102);">)</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
<span class="n">System</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">out</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">println</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"run process error"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span>
修改LinuxServer的启动方法如下:
<span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">private</span> <span class="n">String</span> <span class="n">LinuxAppiumPath</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="s" style="color: rgb(187, 68, 68);">"/usr/local/lib/node_modules/appium/bin"</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="nf" style="color: rgb(0, 160, 0);">AppiumServer</span><span class="p">(</span><span class="n">String</span> <span class="n">ServerType</span><span class="o" style="color: rgb(102, 102, 102);">,</span> <span class="n">String</span> <span class="n">ip</span><span class="o" style="color: rgb(102, 102, 102);">){</span>
<span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">this</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">setServerType</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">ServerType</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">this</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">setServerIP</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">ip</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="k" style="color: rgb(170, 34, 255); font-weight: bold;">this</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">isRemote</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="kc" style="color: rgb(170, 34, 255); font-weight: bold;">true</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="n">KillTask</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"node"</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="n">log</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">info</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"init remote appium server at "</span><span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">ip</span> <span class="o" style="color: rgb(102, 102, 102);">+</span><span class="s" style="color: rgb(187, 68, 68);">"..."</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span>
<span class="o" style="color: rgb(102, 102, 102);">......</span>
<span class="kd" style="color: rgb(170, 34, 255); font-weight: bold;">public</span> <span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">void</span> <span class="nf" style="color: rgb(0, 160, 0);">runLinuxServer</span><span class="p">(</span><span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">int</span> <span class="n">port</span><span class="o" style="color: rgb(102, 102, 102);">,</span><span class="n">String</span> <span class="n">udid</span><span class="o" style="color: rgb(102, 102, 102);">)</span> <span class="o" style="color: rgb(102, 102, 102);">{</span>
<span class="n">log</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">info</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="s" style="color: rgb(187, 68, 68);">"run "</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="s" style="color: rgb(187, 68, 68);">" Appium Server in port "</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">port</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="s" style="color: rgb(187, 68, 68);">"..."</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">int</span> <span class="n">bpport</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">port</span> <span class="o" style="color: rgb(102, 102, 102);">+</span><span class="mi" style="color: rgb(102, 102, 102);">1</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="kt" style="color: rgb(0, 187, 0); font-weight: bold;">int</span> <span class="n">chromeport</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="n">port</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="mi" style="color: rgb(102, 102, 102);">4792</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="n">String</span> <span class="n">Command</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="s" style="color: rgb(187, 68, 68);">"/usr/bin/node "</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">LinuxAppiumPath</span> <span class="o" style="color: rgb(102, 102, 102);">+</span><span class="s" style="color: rgb(187, 68, 68);">"/appium.js -a "</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">ServerIP</span> <span class="o" style="color: rgb(102, 102, 102);">+</span><span class="s" style="color: rgb(187, 68, 68);">" -p "</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">port</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="s" style="color: rgb(187, 68, 68);">" -bp "</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">bpport</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="s" style="color: rgb(187, 68, 68);">" --session-override --chromedriver-port "</span><span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">chromeport</span> <span class="o" style="color: rgb(102, 102, 102);">+</span><span class="s" style="color: rgb(187, 68, 68);">" -U "</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="s" style="color: rgb(187, 68, 68);">" >/home/wang/log/"</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="n">port</span> <span class="o" style="color: rgb(102, 102, 102);">+</span> <span class="s" style="color: rgb(187, 68, 68);">".log"</span><span class="o" style="color: rgb(102, 102, 102);">;</span>
<span class="n">log</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="na" style="color: rgb(187, 68, 68);">info</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">Command</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="n">runRemoteCommand</span><span class="o" style="color: rgb(102, 102, 102);">(</span><span class="n">Command</span><span class="o" style="color: rgb(102, 102, 102);">);</span>
<span class="o" style="color: rgb(102, 102, 102);">}</span>
(当然AppiumServer类还需要进行一些对应的逻辑调整,比如区分开远程和本地的Server执行的方法,区分Server的Type,区分IP等。这里就不细说了)
3.流程图
大致画了个简单原理的流程图如下:
4.运行结果
具体的用例构建和脚本是用testNG加testReport来处理的,这里也不细写了,运行的部分日志结果如下:
本文分享了在多个设备上使用Appium进行UI自动化测试的挑战与解决策略,包括需求分析、多设备连接、服务器控制及Linux环境部署,旨在解决高并发测试中遇到的adb进程限制和不稳定问题。
2126

被折叠的 条评论
为什么被折叠?



