前言

如何高效管理定位元素,这个是很有学问的问题,也是面试必问的[以下纯属个人观点,勿喷!]。

  • 有的人用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: 首页
# 作者:上海-悠悠 QQ交流群:330467341
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():
'''
# 作者:上海-悠悠 QQ交流群:330467341
遍历读取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模式的代码(用代码去写代码)

上海-悠悠 QQ交流群:330467341

appium+python自动化49-yaml管理定位元素的更多相关文章

  1. Appium+python自动化14-查看webview上元素(DevTools)

    前言 app上webview的页面实际上是启用的chrome浏览器的内核加载的,如何把手机的网页加载到电脑上,电脑的chrome浏览器上有个开发模式DevTools,是可以方便调试的. 一.环境准备 ...

  2. Appium+python自动化14-查看webview上元素(DevTools)【转载】

    前言 app上webview的页面实际上是启用的chrome浏览器的内核加载的,如何把手机的网页加载到电脑上,电脑的chrome浏览器上有个开发模式DevTools,是可以方便调试的. 一.环境准备 ...

  3. python语言使用yaml 管理selenium元素

    1.所有元素都在PageElement下的.yaml,如图 login_page.yaml文件: username: dec: 登录页 type: xpath value: //input[@clas ...

  4. Appium+python自动化

    名称 链接地址 Appium+python自动化8-Appium Python API(上) http://mp.weixin.qq.com/s/WvpT5oRrYY22avI95FuypQ Appi ...

  5. appium+python自动化50-生成定位对象模板templet(jinja2)

    前言 每次自己写pageobject定位元素对象太繁琐,格式都差不多,只是换个定位方法,这种就可以才有模板的方式,批量生成pageobject定位元素对象的模板 python里面生成模板有两个模块可以 ...

  6. Appium+python自动化20-查看iOS上app元素属性

    前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道,appium的windows版自带的Inspector可以定位app上的元素 Mac版的appium1.6的 ...

  7. Appium+python自动化20-查看iOS上app元素属性【转载】

    前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道,appium的windows版自带的Inspector可以定位app上的元素Mac版的appium1.6的版 ...

  8. Appium+python自动化-查看app元素属性

    本文转自:https://www.cnblogs.com/yoyoketang/p/7581831.html 前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道 ...

  9. Appium+python自动化8-Appium Python API

    Appium+python自动化8-AppiumPython API   前言: Appium Python API全集,不知道哪个大神整理的,这里贴出来分享给大家. 1.contexts conte ...

随机推荐

  1. CSS/Compass修改placeholder的文字样式

    在HTML5中,<input>与<textarea>标签支持placeholder属性,用来定义无任何输入时的默认文字. 可以通过CSS修改placeholder的文字样式: ...

  2. EL表达式使用时出现NumberFormatException异常

    从后端数据库取出书本集合,然后循环输出到前端表格: <c:forEach items="${bookManagedBean.bookList}" var="book ...

  3. mysql 库操作、存储引擎、表操作

    阅读目录 库操作 存储引擎 什么是存储引擎 mysql支持的存储引擎 如何使用存储引擎 表操作 创建表 查看表结构 修改表ALTER TABLE 复制表 删除表 数据类型 表完整性约束 回到顶部 一. ...

  4. 五:ZooKeeper的集群命令客户端的链接和命令操作的使用

    一:zookeeper客户端链接[1]进入zookeeper的安装目录的bin目录下         # cd /opt/zookeeper/bin[2]敲击链接客户端的命令(zkCli.sh)    ...

  5. poj 1724(最短路+优先队列)

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13436   Accepted: 4921 Descriptio ...

  6. 树莓派使用opencv

    安装 reference1 reference2 注意 安装顺利,但是使用的时候提示 you need install libgtk2.0-dev xxx ,这时候说明你安装的库的顺序不对,你应该先安 ...

  7. 微信小程序 - video组件poster无效 / 视频播放列表

    在做有关微信小程序有关视频播放页面的时候,遇到video组件设置poster无效果,然后查了下poster属性:视频封面的图片网络资源地址,如果 controls 属性值为 false 则设置 pos ...

  8. Java学习笔记(一)——关于java中的String类

    [前面的话] 毕业将近6个月了,试用期也快要过去了,期待接下来的日子.在金融类性质的机构,最痛苦的是也许就是大部分系统外包,所以比较少写代码,在这六个月中只写了1个月左右的代码,然后每天都在做一些比较 ...

  9. Codeforces gym102058 J. Rising Sun-简单的计算几何+二分 (2018-2019 XIX Open Cup, Grand Prix of Korea (Division 2))

    J. Rising Sun time limit per test 1.0 s memory limit per test 1024 MB input standard input output st ...

  10. 使用0填充string(构造类似‘00001’的字符串)

    今天在对视频进行爬取的时候,发现url最后是000001,然后是000002,依次增加,而且每一个url请求只能得到一个分段了的视频,这种情况下构造url就成了一个问题. python有一个函数可以处 ...