APPIUM学习4
来源:互联网 发布:深圳新菜鸟网络俱乐部 编辑:程序博客网 时间:2024/06/05 19:39
[原文]从0到1搭建移动App功能自动化测试平台(3):编写iOS自动化测试脚本
第一个测试用例:系统登录
在测试领域中,系统登录这个功能点的地位,堪比软件开发中的Hello World,因此第一个测试用例就毫无悬念地选择系统登录了。
在编写自动化测试脚本之前,我们首先需要清楚用例执行的路径,路径中操作涉及到的控件,以及被操作控件的属性信息。
对于本次演示的APP来说,登录时需要先进入【My Account】页面,然后点击【Login】进入登录页面,接着在登录页面中输入账号密码后再点击【Login】按钮,完成登录操作。
确定了操作路径以后,就可以在Appium Ruby Console中依次操作一遍,目的是确保代码能正确地对控件进行操作。
第一步要点击【My Account】按钮,因此先查看下Button控件属性。要是不确定目标控件的类型,可以直接执行page命令,然后在返回结果中根据控件名称进行查找。
[1] pry(main)> page :button...(略)UIAButton name, label: My Account id: My Account => My Accountnil
通过返回结果,可以看到【My Account】按钮的name、label属性就是“My Account”,因此可以通过button_exact('My Account')方式来定位控件,并进行点击操作。
[2] pry(main)> button_exact('My Account').clicknil
执行命令后,观察iOS模拟器中APP的响应情况,看是否成功进入“My Account”页面。
第二步也是类似的,操作代码如下:
[3] pry(main)> button_exact('Login').clicknil
进入到登录页面后,再次查看页面中的控件信息:
[4] pry(main)> page...(略)UIATextField value: Email Address id: Email Address => Email AddressUIASecureTextField value: Password (6-16 characters) id: Password (6-16 characters) => Password (6-16 characters)UIAButton name, label: Login id: Log In => Login 登录 => Login...(略)
第三步需要填写账号密码,账号密码的控件属性分别是UIATextField和UIASecureTextField。由于这两个控件的类型在登录页面都是唯一的,因此可以采用控件的类型来进行定位,然后进行输入操作,代码如下:
[5] pry(main)> tag('UIATextField').type 'leo.lee@dji.com'""[6] pry(main)> tag('UIASecureTextField').type '123456'""
执行完输入命令后,在iOS模拟器中可以看到账号密码输入框都成功输入了内容。
最后第四步点击【Login】按钮,操作上和第二步完全一致。
[7] pry(main)> button_exact('Login').clicknil
执行完以上四个步骤后,在iOS模拟器中看到成功完成账号登录操作,这说明我们的执行命令没有问题,可以用于编写自动化测试代码。整合起来,测试脚本就是下面这样。
button_exact('My Account').clickbutton_exact('Login').clicktag('UIATextField').type 'leo.lee@dji.com'tag('UIASecureTextField').type '12345678'button_exact('Login').click
将以上脚本保存为login.rb文件。
但当我们直接运行login.rb文件时,并不能运行成功。原因很简单,脚本中的button_exact、tag这些方法并没有定义,我们在文件中也没有引入相关库文件。
在上一篇文章中有介绍过,通过arc启动虚拟机时,会从appium.txt中读取虚拟机的配置信息。类似的,我们在脚本中执行自动化测试时,也会加载虚拟机,因此同样需要在脚本中指定虚拟机的配置信息,并初始化Appium Driver的实例。
初始化代码可以通过Appium Inspector生成,基本上为固定模式,我们暂时不用深究。
添加初始化部分的代码后,测试脚本如下所示。
require 'rubygems'require 'appium_lib'capabilities = {'appium-version' => '1.0','platformName' => 'iOS','platformVersion' => '9.3',}server_url = "http://0.0.0.0:4723/wd/hub"Appium::Driver.new(caps: capabilities).start_driverAppium.promote_appium_methods Object# testcase: loginbutton_exact('My Account').clickbutton_exact('Login').clicktag('UIATextField').type 'leo.lee@dji.com'tag('UIASecureTextField').type '123456'button_exact('Login').clickdriver_quit
优化测试脚本:加入等待机制
如上测试脚本编写好后,在Terminal中运行ruby login.rb,就可以执行脚本了。
运行命令后,会看到iOS虚拟机成功启动,接着App成功进行加载,然后自动按照前面设计的路径,执行系统登录流程。
但是,在实际操作过程中,发现有时候运行脚本时会出现找不到控件的异常,异常信息如下所示:
➜ ruby login.rb/Library/Ruby/Gems/2.0.0/gems/appium_lib-8.0.2/lib/appium_lib/common/helper.rb:218:in `_no_such_element': An element could not be located on the page using the given search parameters. (Selenium::WebDriver::Error::NoSuchElementError)from /Library/Ruby/Gems/2.0.0/gems/appium_lib-8.0.2/lib/appium_lib/ios/helper.rb:578:in `ele_by_json'from /Library/Ruby/Gems/2.0.0/gems/appium_lib-8.0.2/lib/appium_lib/ios/helper.rb:367:in `ele_by_json_visible_exact'from /Library/Ruby/Gems/2.0.0/gems/appium_lib-8.0.2/lib/appium_lib/ios/element/button.rb:41:in `button_exact'from /Library/Ruby/Gems/2.0.0/gems/appium_lib-8.0.2/lib/appium_lib/driver.rb:226:in `rescue in block (4 levels) in promote_appium_methods'from /Library/Ruby/Gems/2.0.0/gems/appium_lib-8.0.2/lib/appium_lib/driver.rb:217:in `block (4 levels) in promote_appium_methods'from login.rb:28:in `<main>'
更奇怪的是,这个异常并不是稳定出现的,有时候能正常运行整个用例,但有时在某个步骤就会抛出找不到控件的异常。这是什么原因呢?为什么在Appium Ruby Console中单步操作时就不会出现这个问题,但是在执行脚本的时候就会偶尔出现异常呢?
原来,在我们之前的脚本中,两条命令之间并没有间隔时间,有可能前一条命令执行完后,模拟器中的应用还没有完成下一个页面的加载,下一条命令就又开始查找控件,然后由于找不到控件就抛出异常了。
这也是为什么我们在Appium Ruby Console中没有出现这样的问题。因为手工输入命令多少会有一些耗时,输入两条命令的间隔时间足够虚拟机中的APP完成下一页面的加载了。
那针对这种情况,我们要怎么修改测试脚本呢?难道要在每一行代码之间都添加休眠(sleep)函数么?
也不用这么麻烦,针对这类情况,ruby_lib实现了wait机制。将执行命令放入到wait{}中后,执行脚本时就会等待该命令执行完成后再去执行下一条命令。当然,等待也不是无休止的,如果等待30秒后还是没有执行完,仍然会抛出异常。
登录流程的测试脚本修改后如下所示(已省略初始化部分的代码):
wait { button_exact('My Account').click }wait { button_exact('Login').click }wait { tag('UIATextField').type 'leo.lee@dji.com' }wait { tag('UIASecureTextField').type '123456' }wait { button_exact('Login').click }
对脚本添加wait机制后,之前出现的找不到控件的异常就不再出现了。
优化测试脚本:加入结果检测机制
然而,现在脚本仍然不够完善。
我们在Appium Ruby Console中手工执行命令后,都是由人工肉眼确认虚拟机中APP是否成功进入下一个页面,或者返回结果是否正确。
但是在执行自动化测试脚本时,我们不可能一直去盯着模拟器。因此,我们还需要在脚本中加入结果检测机制,通过脚本实现结果正确性的检测。
具体怎么做呢?
原理也很简单,只需要在下一个页面中,寻找一个在前一个页面中没有的控件。
例如,由A页面跳转至B页面,在B页面中会存在“Welcome”的文本控件,但是在A页面中是没有这个“Welcome”文本控件的;那么,我们就可以在脚本中的跳转页面语句之后,加入一条检测“Welcome”文本控件的语句;后续在执行测试脚本的时候,如果页面跳转失败,就会因为找不到控件而抛出异常,我们也能通过这个异常知道测试执行失败了。
当然,对下一页面中的控件进行检测时同样需要加入等待机制的。
登录流程的测试脚本修改后如下所示(已省略初始化部分的代码):
wait { button_exact('My Account').click }wait { text_exact 'System Settings' }wait { button_exact('Login').click }wait { button_exact 'Forget password?' }wait { tag('UIATextField').type 'leo.lee@dji.com' }wait { tag('UIASecureTextField').type '12345678' }wait { button_exact('Login').click }wait { text_exact 'My Message' }
至此,系统登录流程的自动化测试脚本我们就编写完成了。
To be continued …
在本文中,我们通过系统登录这一典型功能点,演示了编写自动化测试用例的整个流程。
在下一篇文章中,我们还会对自动化测试脚本的结构进行进一步优化,并实现测试代码工程化。
Read More ...
公众号:DebugTalk
原文链接:http://debugtalk.com/post/build-app-automated-test-platform-from-0-to-1-write-iOS-testcase-scripts
相关文章
- 《从0到1搭建移动App功能自动化测试平台(0)背景介绍和平台规划》
- 《从0到1搭建移动App功能自动化测试平台(1)模拟器中运行iOS应用》
- 《从0到1搭建移动App功能自动化测试平台(2)操作iOS应用的控件》
- APPIUM学习4
- Appium(学习)
- appium学习
- appium的入门学习
- Appium学习-IOS初窥
- Appium学习-关于Inspector
- appium学习资源汇总
- Appium学习记录01
- APPIUM测试学习
- APPIUM学习2
- APPIUM学习3
- APPIUM学习--环境安装
- Appium学习之踩坑合集
- Appium学习(1)
- Appium学习(2)
- Appium学习(3)
- Appium学习笔记
- appium学习资料
- myeclipse10配置jdk1.7
- x86主机搭建家庭智能路由系统 ---- Proxmox虚拟化实现一机多用
- 算法竞赛入门经典 第二版 习题5-14 交易所 Exchange uva1598
- 如何移植ugfx流程
- MalformedJsonException
- APPIUM学习4
- Python DataFrame设置/更改列表字段/元素类型
- ffmpeg 的 tbr tbc 和 tbn的意义
- reactor, proactor
- 循环抓取图片
- jquery排序 sort()
- HDU-1532-Drainage Ditches
- git 相关记录
- poj-2236 Wireless Network (并查集)