相对于appium操作appium 来做ui自动化时 uiautomator2要简洁多。
例如做app的登录相关user
先写好用例:
然后在setup那里把启动app 写成初始化 然后封装user的点击输入点击下一步操作为公共方法:
import uiautomator2 as u2
import unittest
import time
import os
import xlrd
import json
from lib import HTMLTestRunner
file_path = os.path.normpath(os.path.join(os.path.dirname(os.path.dirname(__file__)), "testcase"))
file1 = file_path+‘/Mycase.xlsx‘#取相对路径 二者选其一就行
book = xlrd.open_workbook(file1) # 打开excel文件
sheet = book.sheet_by_index(0) # 通过索引打开第一个表
nrows = sheet.nrows # 获取所有行数
class Mycase(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.d= u2.connect()
cls.sess=cls.d.session(‘com.pay.payments‘) # 第三种启动app的方式
time.sleep(1)
cls.d.xpath(‘//android.widget.ImageButton‘).click()
cls.d(resourceId="com.pay.payments:id/txt_register").click()
time.sleep(1)
cls.d.press("back")
def user(self,username):
self.d(resourceId="com.pay.payments:id/edt_email_mobile").click()
self.d.send_keys(username)
self.d(resourceId="com.pay.payments:id/image_submit").click()
def test_user_null(self):
"""
检查用户为空直接点击下一步
:return:
"""
nrow_value = sheet.row_values(1)
self.user(nrow_value[2])
#获取到app提示信息
message = self.sess.toast.get_message()
print message
time.sleep(1)
#校验期望结果是否等于message
assert (nrow_value[3] == message)
def test_user_short(self):
"""
检查用户名称太短
例如直接输入个a
:return:
"""
nrow_value = sheet.row_values(2)
self.user(json.loads(nrow_value[2]))
# 获取到app提示信息
message = self.sess.toast.get_message()
print message
time.sleep(1)
#校验期望结果是否等于message
assert (nrow_value[3] == message)
存在几个重点:
(1)setUpClass是为了不让每次执行用例都启动一次app 故写成初始化 用setUpClass 加上@classmethod
(2)封装点击user输入框、输入值、点击下一步为公共函数 减少代码冗余:
(3)难点是U2 获取app页面的toast 本人亲测发现一种自带方法:
message = self.sess.toast.get_message()
print message
可以直接把toast打印出来,进而我们来校验表格的期望结果跟 实际出现的message 来对比 用例校验完成
(4)操作excel表格
file1 = file_path+‘/Mycase.xlsx‘#取相对路径 二者选其一就行
book = xlrd.open_workbook(file1) # 打开excel文件
sheet = book.sheet_by_index(0) # 通过索引打开第一个表
nrows = sheet.nrows # 获取所有行数
file_path可以用相对路径来代替就是 os里面那个,这些都完成之后,我们就是利用unittest框架来执行全部用例,生成测试报告,和发送email
thats all 喜欢app 自动化的同学赶紧去操作一波吧