实验:Appium核心应用(三)
作者:强官涛   类型:Python开发    类别:实验   日期:2019-12-20    阅读:3660 次   消耗积分:0 分

本周分享《Appium核心应用》实验中的原生应用测试

回顾上周内容,请点击

教材连载:Appium核心应用(一)

教材连载:Appium核心应用(二)




“一笔记账”是一个原生的Android应用程序,所以本节内容将主要为大家演示如何利用Appium对该原生应用程序进行自动化测试。基本测试步骤如下:

(1)设计测试用例,明确测试点和操作步骤。

(2)利用UI Automator Viewer识别对应的元素属性。

(3)开发Appium脚本,并完成对用例的断言。

(4)调试脚本,确保流畅运行,并达到自动化测试目的。


由于本节内容重点在于对象识别和测试脚本开发,所以我们先来完成一个相对简单的测试流程,将重心放在Appium测试脚本的开发中。主要针对“一笔记账”完成一个记账操作,主要操作界面有以下两个,如下图所示。


20191220_114652_923.png



根据上图所示的操作步骤,现在使用UI Automator Viewer工具来完成对象属性的识别。首先来看看第一屏的“账目列表”和“记一笔”两个对象的属性情况。



20191220_114707_548.png




通过上图的属性识别后,我们首先需要来规划对象识别的操作方案,因为再好的自动化测试,如果没有办法准确地找到我们需要的元素,将变得毫无意义。


(1)账目列表有多行,每一行主要由两个内容构成:账目备注和所花费用。而账目备注的resource-id属性值为“com.mobivans.onestrokecharge:id/account_item_txt_remark”,所花费用的resource-id属性值为“com.mobivans.onestrokecharge:id/account_item_txt_money”。这本身没有问题,使用ID属性定位元素是最高效的做法,但是现在的问题是账目列表中的每一行元素,都是这两个相同的resource-id属性,那么,我们使用driver.find_element_by_id方法就无法精确定位到我们需要找的那一行。这种情况下该怎么处理呢?既然元素有resource-id属性,且有多个元素具备相同的resource-id属性,那么我们可以使用driver.find_elements_by_id复数形式的方法来获取所有相同ID属性的元素,然后遍历这些元素,再利用元素的get_attribute(“text”)方法或者.text属性获取到对应的text属性值,进而判断该值是否与我们输入的值一致,进而达到断言的目的。


(2)对于按钮“记一笔”来说,这是我们完成核心操作的第一步,必须准确定位到该元素上。通过UI Automater Viewer的识别我们可以看到,该添加按钮是一个图标带文本的按钮,即我们可以操作图标完成添加,也可以直接点击正文文本完成添加。但是这个图文按钮都没有resource-id属性。这种情况下又该如何处理呢?我们可以通过两种方案来解决。一是该图文按钮的上一层是一个LinearLayout的布局对象,并且具备resource-id属性“com.mobivans.onestrokecharge:id/main_write1”,该元素是图文按钮的父元素,我们通过先寻找到其父元素,再寻找子元素的方式,利用XPath定位即可找到。另外一种方式是直接利用文本按钮的text属性,使用driver.find_element_by_name方法查找到该元素,完成操作。

 

当完成了第一屏的元素分析后,我们继续来完成第二屏的元素分析。在第二屏中的元素,除了选择支出类型的地方使用的是图文按钮外,其它元素都有对应的resource-id属性,现列举如下:


(1)按钮“支出”,resource-id为“com.mobivans.onestrokecharge:id/add_txt_Pay”,text为“支出”。


(2)按钮“书籍“,resource-id为“com.mobivans.onestrokecharge:id/item_cate_image”,但是所有类别的resource-id均为相同属性,所以不可用,退而求其次,使用正文文本按钮,利用driver.find_element_by_name方法查找其text属性即可。


(3)文本框“备注”,resource-id为“com.mobivans.onestrokecharge:id/add_et_remark”,唯一识别。


(4)下方数据按钮,每一个按钮对应一个resource-id属性,且唯一识别。


(5)按钮“完成”,resource-id为“com.mobivans.onestrokecharge:id/keyb_btn_finish”,唯一识别。

 

对上述界面元素进行分析和找到定位方案后,接下来完成以下测试脚本的开发。


from appium   import webdriver

from time import   sleep

from   selenium.webdriver.common.action_chains import ActionChains

import os

app_path = os.path.abspath('.')   + '\\yibijizhang.apk'  # 定义apk文件

 

desired_caps =   {}       # 定义webdriver的兼容性设置字典对象

desired_caps['platformName']   = 'Android'    # 指定测试Android平台

desired_caps['platformVersion']   = '4.4.2'   # 指定移动端的版本号

desired_caps['deviceName']   = 'Appium'       # 指定设备名称

desired_caps['unicodeKeyboard']   = 'True'

desired_caps['app']   = app_path              # 如已安装可不指定

# 通过aapt命令输出的package取得启动的主包名

desired_caps['appPackage']   = 'com.mobivans.onestrokecharge'

# 通过aapt输出的launchable-activity取得主Activity名

desired_caps['appActivity']   = 'com.stub.stub01.Stub01'

desired_caps['udid']   = '127.0.0.1:62001'    # 指定设备编号

 

# 实例化webdriver,并指定appium服务器访问地址,一定要加上/wd/hub

driver =   webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

sleep(3)

 

#   driver.find_element_by_name("记一笔").click()  # 点击添加按钮

 

# 添加按钮也可以使用XPath定位找到记一笔的图形按钮, XPath中的resource-id不要简写

driver.find_element_by_xpath("//android.widget.LinearLayout[@resource-id='com.mobivans.onestrokecharge:id/main_write1']/android.widget.ImageView[1]").click()

 

driver.find_element_by_id("add_txt_Pay").click()    # 点击支出

driver.find_element_by_name("书籍").click()         # 选择书籍

# 添加备注,使用send_keys发送文本内容

driver.find_element_by_id("add_et_remark").send_keys(u'购买自动化测试教材')

driver.find_element_by_id("keyb_btn_5").click()

driver.find_element_by_id("keyb_btn_6").click()

driver.find_element_by_id("keyb_btn_finish").click()

sleep(2)

 

# 由于账目列表会存在多个,所以此处断言需要使用复数形式来先获取一个元素列表

list_remark =   driver.find_elements_by_id("account_item_txt_remark")

list_money =   driver.find_elements_by_id("account_item_txt_money")

if   (list_remark[0].text == "购买自动化测试教材" and list_money[0].text   == "-56"):

    print("测试成功.")

else:

print("测试失败.")

 

driver.quit()   # 结束测试


 

上述代码完成了针对一个原生Android应用的测试开发。并且对常见的一些对象识别方式进行了应用。其实针对GUI界面的自动化测试,无论是针对PC端还是移动端,首先一定要想办法识别到对象,然后才能对此进行操作。


另外,Android SDK自带的UI Automator Viewer虽然已经足够使用,但是在识别对象时特别是需要利用XPath来识别对象时,我们需要自己完成XPath的编写,难免会容易出错。所以,在基于UI Automator Viewer的基础上,提供了另外一个功能更加强大的Lazy UI Automator Viewer,除了具备标准版的所有功能外,还帮助我们自动生成XPath和UiaSelector(即可以使用driver.find_element_by_android_uiautomator()方法进行对象操作),当某些元素没有text,没有resource-id,没有content-desc或者不能唯一识别时,那么Lazy UI Automator Viewer提供的XPath和UiaSelector将为我们提供效率更高的对象识别方案。


直接在网络上搜索Lazy UI Automator Viewer并完成下载,这是一个11MB左右大小的jar文件,命名为“uiautomatorviewer.jar”。下载完成后,将该文件替换掉Android SDK自带的同名文件(在SDK目录下的tools\lib目录下),然后重新启动uiautomatorviewer.bat即可。下图展示了利用Lazy UI Automator Viewer识别一笔记账应用中的“备注”文本框的XPath和Uia识别属性。


20191220_114736_526.png



Lazy UI Automator Viewer只是一个帮助我们快速书写XPath或UiaSelector表达式的辅助工具而已,并没有什么神奇的功能。无法识别的对象仍然无法识别。但是针对可以识别的对象,可以却可以帮助我们更快速地完成定位。所以,后续章节内容我们将更多的使用该工具。



下周推送:Web应用测试



为了答谢大家对蜗牛学院的支持,蜗牛学院将会定期对大家免费发放干货,敬请关注蜗牛学院的官方微信。


20190320_095757_834.jpg







版权所有,转载本站文章请注明出处:蜗牛学院在线课堂, http://www.woniuxy.com/note/438
上一篇: 资讯:周日直播福利:准备找工作或计划年后跳槽的程序员必看!
下一篇: 资讯:2019,这是我的年终总结!
提示:登录后添加有效评论可享受积分哦!