当前位置: 首页 > 科技观察

使用macaca进行移动端混合自动化测试(二)

时间:2023-03-15 13:43:05 科技观察

Macacaca是阿里巴巴基于Node.js开发的开源自动化测试工具。它支持原生、混合和移动网络。关于macaca的详细介绍,请参考macaca官网。macaca是如何驱动自动化测试的呢?事实上,macaca和appium在架构和一些应用层面上有很多相似之处。作为客户端,我们可以使用不同的语言编写测试脚本,其中测试脚本遵循webdriver协议,客户端向测试框架启动的服务端发送http请求。正因为客户端和服务器基于http进行通信,所以客户端可以支持不同的编程语言。服务器解析HTTP请求,然后调用IOS提供的UIAutomation库进行模拟点击等操作。操作完成后,移动设备会将操作结果返回给服务器,然后服务器再将操作结果返回给客户端。?提到了webdriver协议:其实就是一个基础的协议规范。正是因为有了这样的协议,一些自动化测试框架才可以编写多种语言的测试脚本。它提供了网页操作的相关规范,如元素定位、浏览器原生事件操作,以及一系列获取DOM元素属性的方法。无论用什么语言编写测试脚本,都应该遵循这个协议规范。WebDriver通过本机浏览器支持或浏览器扩展直接控制浏览器。WebDriver是为每个浏览器开发的,它取代了被测Web应用程序中嵌入的JavaScript。与浏览器的紧密集成可以创建更高级的测试,从而避免JavaScript安全模型强加的限制。除了浏览器供应商的支持,WebDriver还使用操作系统级调用来模拟用户输入。webDriver支持所有主流浏览器,也支持Iphone和Android手机应用测试。接下来带大家一步步使用macaca进行自动化测试:step1全局安装macaca的cli。如果觉得慢,换成淘宝的cnpm镜像。npminstallmacaca-g安装后,可以进入//viewcli提供其他功能macaca-h//查看当前环境配置macacadoctor//启动单独的webdriverservermacacaserver//启动测试macacarun现在输入macacadoctor:在Android上有checklist中有2个红色提示,说明这2个选项的配置还没有完成。我现在以IOS为例,不考虑这两个与Andriod相关的配置。如果你不确定,你可以谷歌。其中,在IOSchecklist中:出现了Xcode和ios_webkit_debug_proxy。首先你需要通过应用商店安装Xcode。全局安装ios_webkit_debug_proxy包,用于测试ios的webview:brewinstallios-webkit-debug-proxy另外需要全局安装ios-driver:npmimacaca-ios-g,这样基本的测试套件就准备好了。接下来可以clonemacaca官方提供的sample,包括IOSapp和相关的测试脚本,按照官方文档感受一下大致流程:gitclonehttps://github.com/macacajs/macaca-test-sample.git--depth=1接下来做自己的测试工作:因为我是前端开发,所以想测试native中的webview。首先让IOS的同学帮忙打包一个.app格式的应用,压缩成zip格式的文件。PS:打包时使用debug模式。原料准备好了,先歇会儿吧。在做UI测试的时候,要模拟用户的各种操作,必须要知道原生应用上不同界面的元素,就像获取html中的DOM节点一样。因为macaca提供了一个API,通过XPath获取原生页面上的不同元素节点。所以可以这样做。Macaca提供了app-inspector,一个使用树状结构查看UI布局并自动生成XPath的工具。安装npminstallapp-inspector-g后,通过macaca-cli启动您的IOS模拟器并运行您的应用程序。然后通过app-inspector启动UI检测工具,app-inspector-uYOUR-DEVICE-ID的方式获取uuid:命令行输入:xcrunsimctllist这个命令会列出你所有的模拟器信息,里面包含类似XXXXXXXX-XXXX-XXXX的代码其中-XXXX-XXXXXXXXXXXX为模拟器UDID,选择当前模拟器状态为Booted的那个。通过app-inspector启动这个工具后,在Chrome中打开命令行提示的浏览器地址,这样就可以在浏览器上看到原生打开的ios页面了。因为要测试webview页面,所以原生页面的所有元素节点都使用app-inspector工具获取Xpath,然后写一个测试脚本模拟用户的操作,一步步进入webview页面。在我测试的应用中,从打开app到进入待测webview页面的测试脚本变成:.waitForElementByXPath('//XCUIElementTypeApplication[1]/XCUIElementTypeWindow[1]/XCUIElementTypeOther[2]/XCUIElementTypeButton[1]').click()//用户名input.waitForElementByXPath('//XCUIElementTypeApplication[1]/XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeTextField[1]').sendKeys(用户名)//密码输入.waitForElementByXPath('//XCUIElementTypeApplication[1]/XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[3]/XCUIElementTypeSecureTextField[1]').sendKeys(password).sendKeys('\n')//登录按钮。waitForElementByXPath('//XCUIElementTypeApplication[1]/XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeButton[2]').click()//更多按键.waitForElementByXPath('//XCUIElementTypeApplication[1]/XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeImage[1]/XCUIElementTypeButton[2]').click().sleep(1000).swipe(200,400,200,100,500).waitForElementByXPath('//XCUIElementTypeApplication[1]/XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeCollectionView[1]/XCUIElementTypeCell[10]').click().sleep(1000).waitForElementByXPath('//XCUIElementTypeApplication[1]/XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeScrollView[1]/XCUIElementTypeOther[2]').click().sleep(1000)完成了native进入webview页面的所有操作,接下来就是webview的模拟操作。放在下一节。