搭建iOS自动化桥梁的“功臣”—全栈软件测试自动化(11)

发表于:2020-7-09 09:37  作者:赵旭斌 余杰   来源:51Testing软件测试网原创

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签: 软件测试技术 自动化测试

  3.3.3 WebDriverAgent—搭建iOS自动化桥梁的“功臣”
  WebDriverAgent在Appium的iOS自动化测试中起着举足轻重的作用,下面就揭开这位“幕后英雄”的真面目。
  1.什么是WebDriverAgent
  按照官方GitHub的解释,WebDriverAgent是一种基于WebDriver协议实现的可远程控制iOS模拟器和设备的服务器,这也是Appium选择WebDriverAgent的一个很重要的原因。此外,WebDriverAgent还允许用户做一系列的操作,如关闭、单击、滚动等操作。目前来讲,WebDriverAgent是一款iOS端到端测试的完美测试工具,此工具由Facebook开发,并在Facebook中得到广泛使用。
  2.WebDriverAgent安装准备
  首先需要从GitHub上把整个代码库下载下来。这使用命令行git clone <address>实现,如图3.45所示。
  图3.45  下载WebDriverAgent的命令行
  下载完整个代码库后,需要做的第一件事是安装其自带的bootstrap引导脚本。命令如下。
 ./Scripts/bootstrap.sh
  安装完成之后会看到图3.46所示的界面。
  图3.46  WebDriverAgent安装界面
  如图3.46所示,WebDriverAgent的安装过程涉及两件事情。第一件事是下载所有依赖文件,第二件事是创建Inspector。第一件事比较容易理解,那么Inspector是什么呢?Inspector就是一个查看器,用于查看设备或者模拟器当前界面上的控件信息,这对于用户做自动化测试来说非常重要。
  3.启动WebDriverAgent服务
  启动WebDriverAgent服务有很多种方法,其中两种较常见的方法分别是界面启动和命令行启动。
  方法1:直接通过Xcode界面启动
  此方法相对容易,只需要双击项目下的WebDriverAgent.xcode文件,Xcode即可自动打开项目,如图3.47所示。
  图3.47  通过Xcode界面启动服务
  打开项目之后,从左边窗格中定位到WebDriverAgentRunner→UITestingUITests.m选项,如图3.48所示。
  打开UITestingUITests.m文件,在testRunner方法的左边会有一个菱形图标,将鼠标指针放在上面,会出现一个“运行”按钮(位于图3.49中第33行的位置)。
  图3.48  选择UITestingUITests.m
  图3.49  testRunner方法左边的“运行”按钮
  单击运行按钮稍等片刻后,模拟器会成功启动iPhone X,并成功安装WebDriverAgent应用,并且我们会看到此应用在被打开后又退出了。
  其实WebDriverAgent应用打开后并没有真正退出,只是临时关闭了,并在后台保持运行着。如果强制关闭它,整个WebDriverAgent服务器就会被强制停止,因此不要尝试关闭它,包括在用Appium运行自动化测试脚本后。
  如果读者想要尝试在真机上运行,则需要生成iOS证书;否则无法直接在真机上安装App,详细内容请看官方配置文档。
  具体启动了哪个设备取决于启动之前在界面顶部选择了哪个设备,读者可自行选择自己想要的设备,图3.50所示为iPhone X模拟器成功启动的界面。
  图3.50  iPhone X模拟器成功启动的界面
  方法2:以命令行方式启动
  输入图3.51所示的命令。
  图3.51  以命令行方式启动
  不过需要注意的是,需要确保在WebDriverAgent项目的根目录下运行以上命令。此处使用的命令为xcodebuild(Xcode的命令行工具),一共有3个参数,第1个参数project用于指定当前项目文件,一般为xcodeproj文件;第2个参数scheme为WebDriverAgentRunner,也就是刚才我们选择的那个文件夹;第3个参数destination中包含一个platform,用于指定模拟器还是真机,name则为设备名称,这里指定模拟器和iPhone X。从命令行方式同样可以成功启动iPhone X,如图3.52所示。
  图3.52  以命令行方式启动的过程
  当底部出现一个IP地址时,即说明服务器已经启动完成了。相对于方法1,更加推荐方法2,这种方法方便、快捷,只要一个命令即可完成启动。用户可以把命令放在Shell脚本中,下次启动就无须输入那么长的命令了。
  4.查看WebDriverAgent Inspector
  在图3.52中,通过WebDriverAgent最后的那个URL地址,即可成功打开Inspector,一般地址的格式是“http://IP地址:8100”。打开URL后,效果如图3.53所示。
  图3.53所示的内容看起来不太容易理解。那么再试试在URL之后加上/status,看看结果会变成什么样,如图3.54所示。我们可以看到操作系统的名称、版本,设备的IP地址及Session ID。最后再试试加上/inspector,打开http://IP地址:8100/inspector后,可以看到图3.55所示的界面。
  图3.53  打开URL后,展现一个字典格式的字符串
  图3.54  加上/status后,展现为一个字典格式的字符串
  接着,如果你知道App的bundleID即可直接打开App,例如,想要打开Safari,可直接使用如下命令。
   curl -X?POST '-H?"Content-Type: application/json"' \
  -d "{\"desiredCapabilities\":{\"bundleId\":\"com.apple.mobilesafari\"}}" \
  http://IP地址:8100/session
  上述命令用于给服务器发送一个POST请求,payload一般带有需要发送的操作内容。运行以上命令后,Safari浏览器会自动在iPhone模拟器中打开。WebDriverAgent是不是很强大?当然,这只是冰山的一角,WebDriverAgent能做的远不止这些。除了打开应用之外,它还可以执行各种单击、输入等动作,甚至可以完成截图、屏幕纵横旋转、Touch ID(Touch ID只支持模拟器)验证等功能。
  图3.55  加上/inspector后出现的界面
  3.3.4  UIAutomator2—搭建Android自动化测试桥梁的“功臣”
  1.UIAutomator2简介
  UIAutomator2由Google开发,是UIAutomator的第2个版本。相比于1.0版本来说,该版本的改进还是非常大的,最大的提升是速度和稳定性。
  2.UIAutomator2与Appium是如何一起运作的
  Appium的运行原理和Selenium的基本一致,两者都是通过客户端发送请求给Appium服务器端,然后经服务器端处理后返回给客户端,最终完成自动化测试操作。那么UIAutomator2的服务器端具体是如何实现的呢?其实现过程如图3.56所示。
  图3.56所示流程图是由Appium官方提供的。整个流程大概如下:
  发送请求;
  安装APK;
  将请求转发给Handler;
  完成自动化测试;
  回传记录
  图3.56  UIAutomator2的服务器端实现过程
  详细过程如下。
  (1)从客户端(测试脚本)发送请求之后,Appium会创建一个AndroidDriver实例。当然,用户必须要在Desired capabilities中指定automationName为UIAutomator2,这样Appium服务器端启动相应的Session,并根据提供的UIAutomator2找到appium-uiautomator2-driver。
  (2)找到appium-uiautomator2-driver这名“主力”后,再找另一位“副手”—appium-uiautomator2-server,它负责把两个APK安装包下载到用户手机中并进行安装,这两个APK安装包分别为appium-uiautomator2-server-vx.x.x.apk、appium-uiautomator2- server-debug-androidTest.apk。
  这两个文件起着至关重要的作用。第一个APK文件负责执行Handler,Handler的作用是直接向UIAutomator2请求相应的需要执行的自动化测试动作,APK会负责处理所有的Handler;第二个APK文件仅包含一个Test,这个Test并不是测试脚本,而是启动Netty服务器的代码,并且是在用户的被测移动设备上启动的,如图3.57所示。
  图3.57  在设备上启动服务器的代码
  图3.57所示内容即为第二个APK文件包含的Test的内容。从代码中也可以看出,这里有且仅有一个Test,而这个Test只是负责启动Netty服务的代码。
  (3)AppiumServlet负责将收到的请求转发给对应的Handler,Handler在收到请求后,指定UIAutomator2执行对应的动作,并且会将Handler的最终状态返回给AppiumResponse对象。具体代码如图3.58所示。
  图3.58  具体代码
  这里,GetText类就是其中一个Handler,可以看到它继承了SafeRequestHandler。该类下面有一个safeHandle方法,它返回的类是AppiumResponse类,而这只是其中一个Handler。所有Handler均遵循这个模式来处理,而所有Handler返回的AppiumResponse类均会回传给appium-uiautomator2-driver,最后返回给Appium服务器端。

查看《全栈软件测试自动化 Selenium和Appium (Python版)》全部连载章节
版权声明:51Testing软件测试网获得人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。

评 论

论坛新帖

顶部 底部


建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海瀛东律师事务所 张楠律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2020, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道