环境:python2.7
定位工具:weditor
手机:小米
1.环境搭建,需要安装python环境,和编辑工具 pycharm,然后利用python中 uiautomator2 和weditor 这两个包进行接下来的操作。
2.安装方式 直接 命令窗口 pip install 包名 (前提你在环境变量配置了 pip)
3.安装完成之后 检查环境 在命令窗口执行 python -m uiautomator2 init
提示这个Successfully 就是代表环境 OK
4.在命令窗口中执行 python -m weditor
会在浏览器中打开网页,输入设备devices信息 可以 通过 adb devices来进行查询设备 信息。出现树的模样,代表链接上手机,然后点击右上角的Reload 实时显示手机页面。 这样就可以开始你的元素定位了。
5.通用的元素定位方式。
(1)根据文本进行定位。
d(text=显示的文本).click()
(2)通过 resourceId 进行定位
d(resourceId="com.tcl.tclplus:id/cart_layout").click() # 进入购物
3)滑动 上 或者下
手指向上,就是页面往下拉,分两种情况 拉到底 或者 只拉一部分。
拉到底:
d(scrollable=True).scroll.toEnd()
拉一部分:
d.swipe(0.806, 0.801,0.818, 0.487) # 向上滑动 横坐标可以不变,纵坐标是变化的,是变小的趋势 这是手指向上
以此类推 那么需要手指向下:
拉倒底:就是拉倒页面首页 开头部分
d(scrollable=True).scroll.toBeginning(steps=50)
拉一部分
横坐标不变,纵坐标是变化的,是变大的趋势 这是手指向下
(4)滑动 左右
d(scrollable=True).scroll.horiz.toEnd() #横向滚动到最右侧
d(scrollable=True).scroll.horiz.toBeginning() #横向滚动到最左侧
或者
(6)元素判断 可以这样写,通过判断元素的存在性来执行不同的操作
s = self.d(resourceId="com.tcl.tclplus:id/iot_txt_home_name", text=u"立即登录", className="android.widget.TextView")
if len(s) == 0:
print '元素未找到,执行退出操作'
(7)随机字符串或者随机字母 输入
a = random.sample(string.ascii_letters, 4)
data = ''.join([str(x) for x in a])
d(resourceId="com.tcl.tclplus:id/et_invoice_header").set_text(data)
随机从大小写字母中取四位,然后写入到输入框中。
(8)截图
filepaths 就是截图所存的路径,可以自己填写。
filepaths = os.path.normpath(os.path.join(os.path.join(os.path.dirname(os.path.dirname(__file__)), "Automation/Tcase")))
def get_png(self, filename, filepath='/Member'):
"""
截图操作,默认截图的存储路径为Member
"""
imgName = filename + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + '.png' # 截图可以单独保存为别的名字的文件
stringPath = filepaths + '/image' + filepath + '\\' + imgName
print stringPath
# img.save('filename.png')#图片保存在当前项目的文件夹下边
self.d.screenshot().save(stringPath) # 保存文件到指定的文件夹下边
self.get_png(filename='订单-取消购买'.decode('utf-8'), filepath='/Market/订单') 实际调用的时候 需要进行decode
(9)apk 自动安装
def install_app(path):
app_Path = lambda x: os.path.join(file_path, "app", x)
apk = app_Path(path + ".apk")
os.system('adb install -r -d ' + apk)
time.sleep(5)
(10)报告生成
用例文件很多 采用 关键字匹配的方式进行。
def all_case():
testcase = unittest.TestSuite() # 加载测试套件
# 用例的目录,关键字进行匹配
discover = unittest.defaultTestLoader.discover(filepath, pattern='Market*.py', top_level_dir=None)
testcase.addTest(discover)
return testcase
@UI_Report(testcase=all_case(),ReportPath=filepath+'/report/result.html')
def run():
print '生成测试报告'
if __name__ == '__main__':
run()
这里加了一个装饰器
def UI_Report(testcase, ReportPath):
"""
根据传入的testcase 来判断执行哪种报告生成方式。
"""
def Report(s):
@wraps(s)
def creat_report():
AA = hasattr(testcase,'__call__')
# AA = isfunction(testcase)
if AA:
print '这个是函数'
suite = unittest.makeSuite(testcase)
fp = file(ReportPath, 'wb')
runner = HTMLTestRunner(stream=fp, title=r'UI自动化', description=r'接口自动化测试报告')
runner.run(suite) #区别
fp.close()
else:
print '不是函数,是执行run_main方法'
fp = file(ReportPath, 'wb')
runner = HTMLTestRunner(stream=fp, title=r'UI自动化测试报告', description=r'商城')
runner.run(testcase)
fp.close()
return creat_report
return Report
因为run_main 去执行的时候,是打印所有的用例文件+名称
而通过测试套件 添加 类名称时,执行方式不一样
至于公共函数,比如启动app、一些共有的操作,可以写到 公共函数中,
在unitest中 增加setupclass 函数 是只 启动一次app,跟setup 区别一下
下面增加你的公共函数。然后用例文件中 直接通过继承的方式来进行
例如
class test(commons):
执行的过程中需要加上一个清理环境的操作,例如为了保证用例执行可靠 和 及时删除调截图。
def del_file(filepath):
listdir = os.listdir(filepath) # 获取文件和子文件夹
for rename in listdir:
rename = filepath + "//" + rename
if os.path.isfile(rename): # 是文件
os.remove(rename) # 删除文件
elif os.path.isdir(rename): # 是子文件
duellist = os.listdir(rename)
for f in duellist: # 遍历该子文件夹
file_path = os.path.join(rename, f)
if os.path.isfile(file_path): # 删除子文件夹下文件
os.remove(file_path)
elif os.path.isdir(file_path): # 强制删除子文件夹下的子文件夹
shutil.rmtree(file_path)
可以在用例文件执行开头增加一些 调用方法
如删除截图 和初始化 app环境 都是可以的
至此 python2.7+android+UI自动化分享完毕。大家有兴趣一起学习。