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服务器端。
版权声明:51Testing软件测试网获得人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。