目录结构
一、YAML概述
1. YAML简介
2. YAML下载安装
二、yaml数据类型详解
1. yaml数据类型
2. yaml数据读取
3. yaml数据修改
4. yaml数据转化
三、YAML实践:Capability配置文件-数据与代码分离
一、YAML概述
引入YAML:
Capability中的各个参数取值是会随设备和APP不同而不同,通过数据和代码分离,将频繁变动的部分抽离出来放到配置文件中,减少代码冗余的误操作引起的执行异常,类似于Web前端的html标签和css分离,推荐使用YAML管理配置数据
1. YAML简介
YMAL是一种简洁的非标记性语言,其以数据为中心,使用空白、缩进、分行来组织数据,数据表示简洁易读。YAML解析实现简易,适合在脚本语言中使用,如:Ruby、Java、Perl、Python、PHP、JavaScript。YAML作为专门用于写配置文件的语言,比JSON格式方便。
YAML语言特点:
①大小写敏感
②使用缩进表示层级关系
③缩进时不允许使用Tab键,只允许使用空格
④缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
2. YAML下载安装
传送门:http://pyyaml.org/wiki/PyYAML
安装命令:pip install pyyaml
检验安装效果:
python
import yaml
以上无异常,则表示安装ok
二、yaml数据类型详解
1. yaml数据类型
支持的数据类型:
(1)纯量:数据最小的单位,单个的、不可再分的值。如:字符串、布尔值、整数...
number: 111
{number: '111'}
(2)数组:一组按次序排列的值,又称为序列(sequence)/列表(list)
# yaml风格
# 方式1
- Jack
- Harry
- Sunny
# 方式2
[Jack,Harry,Sunny]
# Python风格
['Jack','Harry','Sunny']
(3)对象 :键值对的集合,又称为映射/字典
注:yaml中键值对的冒号后的值要预留空格
# yaml风格
# 方式1
platformName: Android
platformVersion: 9.0.0
# 方式2
{platformName: Android, platformVersion: 9.0.0}
# Python风格
{'platformName': 'Android', 'platformVersion': '9.0.0'}
数据嵌套
yaml数据嵌套表示,可将各种数据根据实际场景进行组合嵌套
场景:Simon老师25岁,搭档Alice老师22岁,有在管理2个学生Bob和Canddy,分别10岁和9岁
YAML风格:
student.yaml
name: Simon
age: 25
partener:
name: Alice
age: 22
student:
- name: Bob
age: 10
- name: Canddy
age: 9
Python风格:
{'name':'Simon','age':25,'partener':{'name':'Alice','age':22},'student':[{'name':'Bob','age':10},{'name':'Canddy','age':9}]}
2. yaml数据读取
load()方法:load(stream,Loader=FullLoader)
解析文件流中的第一个yaml文档并生成相应的Python对象
测试场景
读取配置文件中的所有信息;读取yaml数据表中的Simon、搭档、学生的信息
代码实现
yaml_load.py
import yaml
file=open('student.yaml','r')
data=yaml.load(file,Loader=yaml.FullLoader)
print(data)
print('-----------------------------')
print(data['name']+"---"+str(data['age']))
print('-----------------------------')
print(data['partener'])
print(data['partener']['name']+"---"+str(data['partener']['age']))
print('-----------------------------')
print(data['student'])
print(data['student'][0]['name'])
print(data['student'][1]['name'])
执行结果:
3. yaml数据修改
data['name']='test'
print(data['name'])
PS:以上只是变量的数据变更,不会真正修改yaml配置表中的数据
4. yaml数据转化
dump()方法:可将Python对象序列化成yaml流
测试场景
将给定的Python数据类型转化为yaml数据类型
lis=['aa','bb','cc']
dic={'url':'www.baidu.com'}
代码实现
yaml_convert.py
import yaml
lis=['aa','bb','cc']
dic={'url1':'www.baidu.com','url2':'www.sogou.com'}
# 输出Python风格数据
print(lis)
print(dic)
print('--------------------')
# 输出YAML风格数据
print(yaml.dump(lis))
print(yaml.dump(dic))
执行结果:
三、YAML实践:Capability配置文件-数据与代码分离
capability的各项参数值与代码进行分离:
将capability中各项固定的配置信息抽离出来存放在一个yaml配置文件中,使用对象数据类型来存储数据;然后在代码中调用load()方法读取配置数据,从而实现数据和代码的分离
desired_caps.yaml
# 移动设备信息
platformName: Android
deviceName: 127.0.0.1:62001
platformVersion: 5.1.1
# 基于uiautomator2识别Toast
automationName: uiautomator2
# 设置键盘输入法Unicode格式
unicodeKeyboard: True
resetKeyboard: True
# 重置登录状态(每次都需要输入[用户名+密码]登录)
noReset: False
# 移动APP应用信息
app: C:\Users\Administrator\Desktop\kaoyanbang_3.3.8beta.244.apk
appPackage: com.tal.kaoyan
appActivity: com.tal.kaoyan.ui.activity.SplashActivity
# 远程服务器配置信息
ip: 127.0.0.1
port: 4723
capability_yaml.py
from appium import webdriver
from selenium.common.exceptions import NoSuchElementException
import yaml
# 解析yaml文档为Python对象
file=open('desired_caps.yaml','r',encoding='UTF-8')
data=yaml.load(file,Loader=yaml.FullLoader)
# 定义字典,存储capabilities配置信息
desired_caps={}
# 移动设备信息
desired_caps['platformName']=data['platformName']
desired_caps['deviceName']=data['deviceName']
desired_caps['platformVersion']=data['platformVersion']
# 基于uiautomator2识别Toast
desired_caps['automationName']=data['automationName']
# 设置键盘输入法Unicode格式
desired_caps['unicodeKeyboard']=data['unicodeKeyboard']
desired_caps['resetKeyboard']=data['resetKeyboard']
# 重置登录状态(每次都需要输入[用户名+密码]登录)
desired_caps['noReset']=data['noReset']
# 移动APP应用信息
desired_caps['app']=data['app']
desired_caps['appPackage']=data['appPackage']
desired_caps['appActivity']=data['appActivity']
# 连接远程服务器,根据配置开启会话
driver=webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub',desired_caps)
driver.implicitly_wait(10) # 等待时间(隐式)
# 定义点击取消升级按钮的方法
def check_cancelBtn():
print('check cancel Button')
try:
cancelBtn=driver.find_element_by_id('android:id/button2')
except NoSuchElementException:
print('no cancel button')
else:
cancelBtn.click()
# 定义点击跳过引导页的方法
def check_skipBtn():
print('check skip Button')
try:
skipBtn=driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
except NoSuchElementException:
print('no skip button')
else:
skipBtn.click()
# 调用函数
check_cancelBtn()
check_skipBtn()
执行效果:
可连接Android模拟器,并安装指定的APP,然后启动APP,跳过取消升级按钮、跳过介绍页面,进入登录界面