[AP_12] YAML下载安装|数据读取|数据转化|数据与代码分离

目录结构

一、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

[AP_12] YAML下载安装|数据读取|数据转化|数据与代码分离_第1张图片

检验安装效果:
python
import yaml

[AP_12] YAML下载安装|数据读取|数据转化|数据与代码分离_第2张图片

以上无异常,则表示安装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'])

执行结果:

[AP_12] YAML下载安装|数据读取|数据转化|数据与代码分离_第3张图片

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))

执行结果:

[AP_12] YAML下载安装|数据读取|数据转化|数据与代码分离_第4张图片


三、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,跳过取消升级按钮、跳过介绍页面,进入登录界面

[AP_12] YAML下载安装|数据读取|数据转化|数据与代码分离_第5张图片

你可能感兴趣的:([AP_12] YAML下载安装|数据读取|数据转化|数据与代码分离)