appium+python自动化49-yaml管理定位元素
前言
如何高效管理定位元素,这个是很有学问的问题,也是面试必问的[以下纯属个人观点,勿喷!]。
- 有的人用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管理定位元素的更多相关文章
- Appium+python自动化14-查看webview上元素(DevTools)
前言 app上webview的页面实际上是启用的chrome浏览器的内核加载的,如何把手机的网页加载到电脑上,电脑的chrome浏览器上有个开发模式DevTools,是可以方便调试的. 一.环境准备 ...
- Appium+python自动化14-查看webview上元素(DevTools)【转载】
前言 app上webview的页面实际上是启用的chrome浏览器的内核加载的,如何把手机的网页加载到电脑上,电脑的chrome浏览器上有个开发模式DevTools,是可以方便调试的. 一.环境准备 ...
- python语言使用yaml 管理selenium元素
1.所有元素都在PageElement下的.yaml,如图 login_page.yaml文件: username: dec: 登录页 type: xpath value: //input[@clas ...
- Appium+python自动化
名称 链接地址 Appium+python自动化8-Appium Python API(上) http://mp.weixin.qq.com/s/WvpT5oRrYY22avI95FuypQ Appi ...
- appium+python自动化50-生成定位对象模板templet(jinja2)
前言 每次自己写pageobject定位元素对象太繁琐,格式都差不多,只是换个定位方法,这种就可以才有模板的方式,批量生成pageobject定位元素对象的模板 python里面生成模板有两个模块可以 ...
- Appium+python自动化20-查看iOS上app元素属性
前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道,appium的windows版自带的Inspector可以定位app上的元素 Mac版的appium1.6的 ...
- Appium+python自动化20-查看iOS上app元素属性【转载】
前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道,appium的windows版自带的Inspector可以定位app上的元素Mac版的appium1.6的版 ...
- Appium+python自动化-查看app元素属性
本文转自:https://www.cnblogs.com/yoyoketang/p/7581831.html 前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道 ...
- Appium+python自动化8-Appium Python API
Appium+python自动化8-AppiumPython API 前言: Appium Python API全集,不知道哪个大神整理的,这里贴出来分享给大家. 1.contexts conte ...
随机推荐
- Android Studio代码字体模糊解决方法
问题描述: 我的电脑分辨率是(1920*1080),然而安装了Android Studio后代码的一些部分区域出现模糊的现象,应该是软件默认设置与高分屏有冲突. 如下图所示. 解决方法: 打开设置对话 ...
- Exchanger学习
Java并发新构件之Exchanger JDK API Exchaner 介绍 JDK API 解释 A synchronization point at which threads can pair ...
- LeetCode解题报告—— Swap Nodes in Pairs & Divide Two Integers & Next Permutation
1. Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For e ...
- 基于rest_framework和redis实现购物车的操作,结算,支付
前奏: 首先,要在主机中安装redis,windows中安装,下载一个镜像,直接进行下一步的安装,安装成功后,在cmd中输入redis-cli 安装python的依赖库: redis 和 ...
- OpenCL与CUDA,CPU与GPU
OpenCL OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式.免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计 ...
- redis之(十八)redis的支持水平扩容的集群特性,以及插槽的相关操作
[一]主从集群的缺点,客户端分片的缺点 (1)主从+哨兵的redis集群,只是做主从备份,数据冗余的一种处理.但在存储空间的扩展上还是有限制.因为集群中的节点都是存储同样的数据.单一节点的容量,就可以 ...
- AC日记——[ZJOI2012]网络 bzoj 2816
2816 思路: 多个LCT: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 10005 #define l ...
- 用Lucene.net对数据库建立索引及搜索<转>
用Lucene.net对数据库建立索引及搜索 最近我一直在研究 Lucene.net ,发现Lucene.net对数据库方面建索引的文章在网上很少见,其实它是可以对数据库进行索引的,我闲着没事,写了个 ...
- CentOS 7.4 如何安装 MariaDB 10.3.9 Stable 数据库
CentOS 7.4 如何安装 MariaDB 10.3.9 Stable 数据库 一.CentOS 7.4上卸载 Mariadb 数据库 1.查询所安装的MariaDB组件 [libin@VM_0_ ...
- 【剑指offer】面试题 4. 二维数组中的查找
面试题 4. 二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...