如何高效管理定位元素,这个是很有学问的问题,也是面试必问的[以下纯属个人观点,勿喷!]。
- 有的人用xml管理页面定位元素,这种逼格略高,但是小编认为学习成本大,贼麻烦。
- 有的人提到用excel管理页面定位元素,这种略显逼格,至少做到了数据分离,但是读取excel太慢,不够高效,还得在excel里面维护,忒麻烦。
- 有的人说把定位元素放数据库管理,这种除了装逼,没觉得有多高效,当然有小伙伴提到接口测试数据量比较大的时候,这种方法还可以。
- 有的人用pageobject模式,直接在page类写定位方法,虽然这种没直接把定位独立出来,但这种非常直观,也易于阅读
那么有没有一种方法,既高效,直观,方便,又能装逼,还能迎合面试官口味呢?接下来就是要讲的这种yaml文件管理
对yaml不了解的可以看我之前发的这篇python笔记14-读取yaml配置文件
环境:
python 3.6
appium 1.8
美团app
yaml包安装:pip install pyyaml
PageObject
1.先回顾一下PageObject模式定位元素的写法,如下这种:
class HomePage: ‘‘‘dec: 首页‘‘‘ # name: 城市选择 city_loc = ("id", "com.sankuai.meituan:id/city_button") # name: 首页搜索 home_loc = ("id", "com.sankuai.meituan:id/search_edit")
yaml管理定位
1.把定位方法放到yaml文件管理,美团app首页元素定位如下:
HomePage: dec: 首页 locators: - name: 城市选择 type: id value: com.sankuai.meituan:id/city_button - name: 首页搜索 type: id value: com.sankuai.meituan:id/search_edit
2.app上[我的]菜单页定位
MyPage: dec: 我的 locators: - name: 我的 type: accessibility_id value: 我的 - name: 请点击登录 type: id value: com.sankuai.meituan:id/user_name
3.登录页面定位,这里我把登录的几个流程页合并到一起了
--- LoginPage: dec: 登录页 locators: - name: 微信登录 type: id value: com.sankuai.meituan:id/passport_button_wechat - name: 手机号登录 type: id value: com.sankuai.meituan:id/passport_button_meituan - name: 其它登录 type: id value: com.sankuai.meituan:id/passport_button_other - name: QQ type: xpath value: //*[@text=‘QQ‘] - name: 微博 type: xpath value: //*[@text=‘微博‘] - name: 账号密码 type: xpath value: //*[@text=‘账号密码‘] - name: 输入账号 type: id value: com.sankuai.meituan:id/edit_account - name: 输入密码 type: id value: com.sankuai.meituan:id/edit_password - name: 登录按钮 type: id value: com.sankuai.meituan:id/login_button
遍历读取os.walk()
1.把不同页面的元素放到对应的页面.yaml文件里,放到同一个目录下,方便一次性遍历读取
- 在page总目录下,建一个pageelement的文件夹(这里是文件夹,里面不要有__init__.py文件),里面放页面元素的定位,不同的页面定义不同的namepage.yaml.
- templetpage放一个自动生成用例的模板(这个模板是没后缀的文件),接下来会讲
- tools.py 用于运行代码后自动生成pages.py脚本
- pages.py 运行tools里面代码后生成的
2.os.walk()遍历读取文件,之前有一篇专门讲过了python笔记4-遍历文件夹目录os.walk()
# coding:utf-8 import yaml import os # 当前脚本路径 basepath = os.path.dirname(os.path.realpath(__file__)) # yaml文件夹 yamlPagesPath = os.path.join(basepath, "pageelement") def parseyaml(): ‘‘‘ 遍历读取yaml文件 ‘‘‘ pageElements = {} # 遍历读取yaml文件 for fpath, dirname, fnames in os.walk(yamlPagesPath): for name in fnames: # yaml文件绝对路径 yaml_file_path = os.path.join(fpath, name) # 排除一些非.yaml的文件 if ".yaml" in str(yaml_file_path): with open(yaml_file_path, ‘r‘, encoding=‘utf-8‘) as f: page = yaml.load(f) pageElements.update(page) return pageElements if __name__ == "__main__": a = parseyaml() print(a) for i in a["HomePage"][‘locators‘]: print(i)
运行结果:
下一篇讲通过templetpage模板自动生成pageobject模式的代码(用代码去写代码)