读取ini配置文件 及 UI对象库
读取ini配置文件
实战:UI 对象库
读取ini配置文件
配置项
在每个 ini 配置文件中,配置数据会被分组(比如下述配置文件中的“config”和“cmd”),每个分组中又可以指定对应的变量值。
示例:test.ini
# 定义config分组
[config]
platformName=Android
appPackage=com.romwe
appActivity=com.romwe.SplashActivity # 定义cmd分组
[cmd]
viewPhone=adb devices
startServer=adb start-server
stopServer=adb kill-server # 定义log分组
[log]
log_error=true
读取API
- read(filename):直接读取文件内容
- sections():得到所有的 section,并以列表的形式返回
- options(section):得到该 section 的所有 option
- items(section):得到该 section 的所有键值对
- get(section,option):得到 section 中 option 的值,返回为 string 类型
- getint(section, option):得到 section 中 option 的值,返回为 int 类型
- getboolean()
- getfloat()
>>> import configparser
>>>
>>> cf = configparser.ConfigParser()
>>> cf.read("e:\\db.ini", encoding="utf-8") # 读取配置文件
['e:\\db.ini']
>>>
>>> cf.sections() # 获取各分组
['config', 'cmd', 'log']
>>>
>>> cf.options("config") # 获取指定分组的所有键
['platformname', 'apppackage', 'appactivity']
>>>
>>> cf.items("config") # 获取指定分组的所有键值对
[('platformname', 'Android'), ('apppackage', 'com.romwe'), ('appactivity', 'com.romwe.SplashActivity')]
>>>
>>> cf.get("log", "log_error") # 获取指定分组及指定键的值
'true'
配置文件中的键是不区分大小写的,例如下述两种方式是等价的:
cf.get("config", "appActivity")
cf.get("config", "APPACTIVITY")
在解析时,getboolean()方法查找任何可行的值,例如以下几个都是等价的:
[log]
log_error=true
log_error=TRUE
log_error=1
log_error=yes
写入API
- write(fp):将config对象写入至某个 .init 格式的文件
- add_section(section):添加一个新的 section
- set(section, option, value):对 section 中的 option 进行设置,需要调用 write 将内容写入配置文件
- remove_section(section):删除某个 section
- remove_option(section, option):删除某个 sction 的某个 key
1 >>> import configparser
2 >>>
3 >>> cf = configparser.ConfigParser()
4 >>>
5 >>> cf.add_section("section1") # 添加分组
6 >>> cf.set("section1", "key1", "value1") # 添加键值对
7 >>> cf.set("section1", "key2", "value2")
8 >>>
9 >>> cf.add_section("section2")
10 >>> cf.set("section2", "key3", "value3")
11 >>>
12 >>> cf.add_section("section3")
13 >>> cf.set("section3", "key4", "value4")
14 >>> cf.set("section3", "key5", "value5")
15 >>>
16 >>> cf.remove_section("section2") # 删除指定分组
17 True
18 >>> cf.remove_option("section3", "key4") # 删除指定分组的指定键值对
19 True
20 >>>
21 >>> cf.sections()
22 ['section1', 'section3']
23 >>>
24 >>> f = open("config.ini", "w")
25 >>> cf.write(f) # 保存配置文件
26 >>> f.flush() # 刷新或关闭文件,数据才会真正写入文件
27 >>> f.close()
实战:UI 对象库
用配置文件存储页面元素的定位方式和定位表达式,做到定位数据和程序的分离。
UiObjectMap.ini
[sogou]
searchBox = id>query
searchButton = id>stb
ObjectMap.py
ObjectMap 工具类文件,供测试程序调用。
1 from selenium.webdriver.support.ui import WebDriverWait
2 import configparser
3 import os
4 from selenium import webdriver
5
6
7 class ObjectMap:
8
9 def __init__(self):
10 # 获取存放页面元素定位方式及定位表达式配置文件路径
11 # os.path.abspath(__file__):获取当前文件所在路径目录
12 self.uiObjectMapPath = os.path.dirname(os.path.abspath(__file__)) + "\\UiObjectMap.ini"
13 print(self.uiObjectMapPath) # E:\eclipse-workspace\AutoTest\UI\UiObjectMap.ini
14
15 def getElementObject(self, driver, webSiteName, elementName):
16 try:
17 # 创建一个读取配置文件的实例
18 cf = configparser.ConfigParser()
19 # 将配置文件加载到内存
20 cf.read(self.uiObjectMapPath)
21 # 根据section和option获取配置文件中页面元素的定位方式及定位表达式组成的字符串,
22 # 并使用">"分隔
23 locators = cf.get(webSiteName, elementName).split(">")
24 # 得到定位方式
25 locatorMethod = locators[0]
26 # 得到定位表达式
27 locatorExpression = locators[1]
28 print(locatorMethod, locatorExpression)
29 # 显式等待获取页面元素
30 element = WebDriverWait(driver, 10).until(lambda x: x.find_element(locatorMethod, locatorExpression))
31 except Exception as e:
32 print(e)
33 else:
34 # 找到页面元素,返回给调用者
35 return element
SoGou.py
调用 ObjectMap 工具类实现测试逻辑。
1 from selenium import webdriver
2 import unittest
3 import time, traceback
4 from UI.ObjectMap import ObjectMap
5
6
7 class TestSoGouObjectMap(unittest.TestCase):
8
9 def setUp(self):
10 self.obj = ObjectMap()
11 self.driver = webdriver.Firefox()
12
13 def tearDown(self):
14 self.driver.quit()
15
16 def testSoGouSearch(self):
17 url = "http://www.sogou.com";
18 self.driver.get(url)
19 try:
20 # 查找页面的搜索输入框
21 searchBox = self.obj.getElementObject(self.driver, "sogou", "searchBox")
22 searchBox.send_keys("WebDriver")
23 # 查找搜索按钮
24 searchButton = self.obj.getElementObject(self.driver, "sogou", "searchButton")
25 searchButton.click()
26 time.sleep(2)
27 self.assertTrue("Selenium" in self.driver.page_source, "assert error!")
28 except Exception:
29 print(traceback.print_exc())
30
31
32 if __name__ == "__main__":
33 unittest.main()
读取ini配置文件 及 UI对象库的更多相关文章
- UI对象库-定位元素与程序分离
1.前言 这几天有人问我,UI自动化测试中使用到的页面定位元素应该存放在哪里比较合适?我想说的是如果你使用的是PO设计模式设计测试用例的话,可以把定位元素存在每一个page页面,一个page存放对应的 ...
- Selenium WebDriver UI对象库
UI对象库:使用配置文件存储测试页面上的定位和定位表达式,做到定位数据和程序的分离. 第一步:实现工具类Object工具类,供测试程序调用. /** * 使用配置文件存储测试页面上的定位和定位表达式, ...
- 转 python3 读取 ini配置文件
在代码中经常会通过ini文件来配置一些常修改的配置.下面通过一个实例来看下如何写入.读取ini配置文件. 需要的配置文件是: 1 [path] 2 back_dir = /Users/abc/Pych ...
- python3笔记-读取ini配置文件
在代码中经常会通过ini文件来配置一些常修改的配置.下面通过一个实例来看下如何写入.读取ini配置文件. 需要的配置文件是: [path] back_dir = /Users/abc/PycharmP ...
- Python读取ini配置文件(接口自动测试必备)
前言 大家应该接触过.ini格式的配置文件.配置文件就是把一些配置相关信息提取出去来进行单独管理,如果以后有变动只需改配置文件,无需修改代码. 特别是后续做自动化的测试,代码和数据分享,进行管理.比如 ...
- bat 读取 ini 配置文件
bat 读取 ini 配置文件 config.ini: abc=abc a=a localpath=D:\local\path .bat: @echo off setlocal enabledelay ...
- python读取ini配置文件的示例代码(仅供参考)
这篇文章主要介绍了python读取ini配置文件过程示范,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 安装 pip install configp ...
- 【python3】configparser读取ini配置文件
在应用过程中,发现下面这个问题: cf=configparser.ConfigParser()读取配置文件时,如果数据包含%这们析特殊符号,就会报出上面的错误,使用cf = configparser. ...
- Python读取ini配置文件的方式
python configparser模块 ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section ...
随机推荐
- 最常用SQL joins:内连接(交集)、左外连接、右外连接、左连接、右连接、全连接(并集),全外连接
1.内连接.两个表的公共部分用Inner join,Inner join是交集的部分. Select * from TableA A inner join TableB B on A.key=B.ke ...
- 前端传递数据到后台的两种方式;创建一个map或者创建一个FormData对象
一.构建一个map getAllDeptAllUsers(){ const modleCode = {'auditMenuId': this.auditMenuId, 'enterpriseId': ...
- Django之csrf中间件及auth模块使用
目录 一.基于配置文件的编程思想 1. importlib 模块 2. 配置文件 二.跨站请求伪造(csrf) 1.csrf简介以及由来 2.Django中的csrf中间件如何使用 2.1 普通for ...
- STL容器整理
1.vector c++STL中的可变长度数组,主要支持操作有:建立,添加到末尾,返回长度,调整大小,定义迭代器及对迭代器的具体操作.具体如下: 1.建立一个元素类型为int的可变长度数组v,最开始N ...
- POJ-2253(最短路变形+dijikstra算法+求解所有路径中所有最长边中的一个最小值)
frogger POJ-2253 这题的代码特别像prim求解最小生成树的代码,其实两者本来也很像. 这里的d数组不再维护的起点到该点的最短距离了,而是路径中的最长距离. #include<io ...
- 华为OD机试题
"""最长回文字符串问题"""# 说明:方法很多,这个是最简单,也是最容易理解的一个,利用了动态规化.# 先确定回文串的右边界i,然后以右边 ...
- .NET 5学习笔记(11)—— Host Blazor WebAssembly in a Windows Service
实在是被某软忽悠瘸了,愤而写此一篇.希望能让同样需求的同学们少走弯路.某软在<在 Windows 服务中托管 ASP.NET Core>中,介绍了通过创建Worker Service工程, ...
- 一文弄懂js的执行上下文与执行上下文栈
目录 执行上下文与执行上下文栈 变量提升与函数提升 变量提升 函数提升 变量提升与函数提升的优先级 变量提升的一道题目引出var关键字与let关键字各自的特性 执行上下文 全局执行上下文 函数(局部) ...
- IPFS挖矿靠谱吗?
IPFS是一个旨在创建持久且分布式存储和共享文件的网络传输协议,前景广阔且实用意义大,为区块链行业提供了一种新的可能.而IPFS挖矿挖出的FIL,则是在IPFS技术的基础上,对维护IPFS网络的用户的 ...
- P1604_B进制星球(JAVA语言)
思路:BigInteger 五杀!利用BigInteger自带的进制转换. //第一次提交WA了几组数据,下载测试数据发现带字母的答案要转换为大写. 题目背景 进制题目,而且还是个计算器~~ 题目描述 ...