appium--使用PyYAML封装Capability
前戏
YAML 语言的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。
它的基本语法规则如下。
- YAML大小写敏感;
- 使用缩进代表层级关系;
- 缩进只能使用空格,不能使用TAB,不要求空格个数,只需要相同层级左对齐(一般2个或4个空格)
# 表示注释,从这个字符一直到行尾,都会被解析器忽略。
YAML 支持的数据结构有三种。
对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
纯量(scalars):单个的、不可再分的值
数组
一组连词线开头的行,构成一个数组。
- Cat
- Dog
- Goldfish
转为 python 如下。
[ 'Cat', 'Dog', 'Goldfish' ]
对象
对象的一组键值对,使用冒号结构表示。
animal: pets
冒号后面一定要有空格
转为 JavaScript 如下。
{ animal: 'pets' }
python读取yaml
安装PyYAML库
pip install PyYAML
数据场景:
Tom Smith37岁,他有一个妻子Jane Smith,25岁,另外他有两个孩子,一个叫Jimmy Smith,15岁。另外一个叫Jenny Smith,12岁
family.yaml
name: Tom Smith age: 37 spouse: name: Jane Smith age: 25 childen: - name: Jimmy Smith age: 15 - name: Jenny Smith age: 12
python文件读取
import yaml file = open('family.yaml', "r") data = yaml.load(file, Loader=yaml.FullLoader) print(data) # {'name': 'Tom Smith', 'age': 37, 'spouse': {'name': 'Jane Smith', 'age': 25}, 'childen': [{'name': 'Jimmy Smith', 'age': 15}, {'name': 'Jenny Smith', 'age': 12}]} print(data['name']) # Tom Smith print(data['age']) # 37 print(data['spouse']['name']) # Jane Smith print(data['spouse']['age']) # 25 print(data['childen']) # [{'name': 'Jimmy Smith', 'age': 15}, {'name': 'Jenny Smith', 'age': 12}] print(data['childen'][0]['name']) # Jimmy Smith print(data['childen'][0]['age']) # 15 print(data['childen'][1]['name']) # Jenny Smith print(data['childen'][1]['age']) # 12
python数据类型转为yaml格式
上面我们使用了yaml.load从yaml里读取,转为python的类型,我们可以使用dump把python类型的转为yaml类型
import yaml lis = ['name', 'age', 'job'] dic = {'IT':'test', 'dev':'ui'} print(yaml.dump(lis)) print(yaml.dump(dic))
结果:
- name - age - job IT: test dev: ui
把python的数据类型写入yaml文件
import yaml lis = {'name': 'Tom Smith', 'age': 37, 'spouse': {'name': 'Jane Smith', 'age': 25}, 'childen': [{'name': 'Jimmy Smith', 'age': 15}, {'name': 'Jenny Smith', 'age': 12}]} dic = {'IT': 'test', 'dev': 'ui'} with open('family.yaml', 'w') as f: f.write(yaml.dump(lis)) f.write(yaml.dump(dic))
结果:
将Capability封装成yaml配置文件
desired_caps.yaml
platformName: Android # 注意要有空格 platforVersion: 9.1.1 deviceName: 127.0.0.1:62001 app: F:\App\csca3.1.0.apk appPackage: com.csca appActivity: com.csca.ui.activity.SplashActivity noReset: False ip: 127.0.0.1 port: 4723
读取配置文件yaml里的内容
import yaml from appium import webdriver file = open('desired_caps.yaml', 'r') data = yaml.load(file, Loader=yaml.FullLoader) desired_caps = {} desired_caps['platformName'] = data['platformName'] desired_caps['platforVersion'] = data['platforVersion'] desired_caps['deviceName'] = data['deviceName'] desired_caps['app'] = data['app'] desired_caps['appPackage'] = data['appPackage'] desired_caps['appActivity'] = data['appActivity'] desired_caps['noReset'] = data['noReset'] driver = webdriver.Remote('http://' + str(data['ip']) + ':' + str(data['port']) + '/wd/hub', desired_caps)