python如何解析配置文件并應(yīng)用到項目中
配置文件的類型
通常自動化測試中的配置文件是以.ini 和 .conf 為后綴的文件
配置文件的組成
1.section
2.option
3.value
配置文件的格式
[section_name] # =號可以使用:號代替 option_name=value
配置文件的注釋
通常使用#號或者;分號注釋,有一點一定要注意,注釋最好不要寫到option_name=value行的后面,否則你會遇到意想不到的錯誤
配置文件的作用
那么我們的配置文件主要來干些什么呢?
1.可以存儲測試中測試用例使用的測試數(shù)據(jù)
2.可以存儲測試中用到的資源數(shù)據(jù),比如數(shù)據(jù)庫的地址,用戶,密碼等等
3.可以作為ui對象庫使用,存儲我們ui自動化測試項目中的頁面元素信息
4.可以存儲項目使用的全局變量,比如項目的根目錄,日志,報告的路徑等等
以上這些數(shù)據(jù)均可以存放在配置文件中,方便的我們讀取,當(dāng)項目的一些配置信息改變時,我們只要修改配置文件即可,而不用修改具體代碼,大大減小項目的維護(hù)成本!
ok,既然我都標(biāo)題黨了,那么現(xiàn)在就告訴你怎么1分鐘應(yīng)用到項目中。有配置文件我們必定要先解析文件才行,我們現(xiàn)在有這樣一個配置文件,存放如下內(nèi)容
[126mail_login] loginPage.frame=xpath>//div[@id='loginDiv']/iframe loginPage.username=xpath>//input[@name='email'] loginPage.password=xpath>//input[@name='password'] loginPage.loginBtn=xpath>//a[@id='dologin'] [126mail_homePage] homePage.addressbook=id>_mail_tabitem_1_4text [126mail_addContactPage] addContactPage.newContact=xpath>//span[text()='新建聯(lián)系人'] addContactPage.newName=id>input_N addContactPage.newMail=xpath>//div[@id='iaddress_MAIL_wrap']//input[@class='nui-ipt-input'] addContactPage.newMark=xpath>//span[@class='nui-chk-text']/preceding-sibling::span/b addContactPage.newPhone=xpath>//div[@id='iaddress_TEL_wrap']//input[@class='nui-ipt-input'] addContactPage.newComment=id>input_DETAIL addContactPage.newCommit=xpath>//span[text()='確 定']
封裝代碼
下面這個封裝是我之前寫的,不算是很通用的功能,但是如果你的配置文件和我上面的一樣用來存儲ui對象庫的話就完全適用了。
"""
------------------------------------
@Time : 2019/5/16 10:56
@Auth : linux超
@File : ParseConfigOld.py
@IDE : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
------------------------------------
"""
from configparser import (
ConfigParser,
NoSectionError,
NoOptionError
)
filename = 'configfile.ini'
class ParseConfigFile(object):
"""
解析ini配置文件
"""
def __init__(self):
try:
self.cf = ConfigParser() # 獲取配置文件對象
self.cf.read(filename, encoding='utf-8') # 加載配置文件到內(nèi)存中
except Exception as e:
raise e
def getItemsSection(self, section):
"""
獲取section下面所有section的鍵值
:param sectionName:
:return:
"""
try:
value = dict(self.cf.items(section))
except (NoSectionError, KeyError):
print('{} not exit'.format(section))
except Exception as e:
raise e
else:
return value
def getElementValue(self, section, option):
"""根據(jù)自己的需要修改這部分代碼"""
try:
# 我配置文件是用這個符號來分割的,所有解析的時候要使用這個符號分割,得到元素
locator = self.cf.get(section, option).split('>')
except (NoSectionError, NoOptionError, KeyError):
print('section:{} or option:{} not exit'.format(section, option))
except Exception as e:
raise e
else:
return locator # 獲取option鍵對應(yīng)的value
def getAllSections(self):
try:
all_sections = self.cf.sections()
except Exception as e:
raise e
else:
return all_sections # 所有的sections返回值是個列表
if __name__=='__main__':
cf = ParseConfigFile()
locator = cf.getElementValue('126mail_login','loginPage.username')
print(locator)
print(cf.getItemsSection('126mail_login'))
print(cf.getAllSections())
封裝改進(jìn)
下面的封裝幾乎可以完成任何自動化測試項目中配置文件存儲任何數(shù)據(jù)類型的數(shù)據(jù)解析
"""
------------------------------------
@Time : 2019/5/16 9:11
@Auth : linux超
@File : ParseConfigFile.py
@IDE : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
------------------------------------
"""
from configparser import (
ConfigParser,
NoOptionError,
NoSectionError
)
class ParseConfigFile(ConfigParser):
def __init__(self, filename):
super().__init__()
try:
self.filename = filename
self.read(filename, encoding='utf-8')
except Exception as e:
raise e
def get_all_option(self, section='DEFAULT'):
"""獲取指定section下所有的option"""
try:
options = self.options(section)
return options
except NoSectionError:
print('NoSectionError : {} not exist'.format(section))
except Exception as e:
raise e
def get_value(self, section='DEFAULT'):
"""獲取指定section中所有的option和value,返回一個字典"""
try:
value = dict(self.items(section))
return value
except (NoSectionError, KeyError):
print('{} not exist'.format(section))
except Exception as e:
raise e
def get_option_value(self, section, option, flag=False):
"""
獲取指定section和option對應(yīng)的數(shù)據(jù)
如果option對應(yīng)數(shù)據(jù)為數(shù)字,則自動轉(zhuǎn)換為int或者float
如果option對應(yīng)的數(shù)據(jù)是個可以使用eval轉(zhuǎn)換的類型,則傳遞flag為True時,自動轉(zhuǎn)換,否則輸出str
"""
try:
value = self.get(section, option)
if value.isdigit():
return int(value)
try:
return float(value)
except Exception:
pass
if isinstance(flag, bool) and flag:
return eval(value)
return value
except (NoSectionError, NoOptionError, KeyError):
print('no option "{}" or section "{}"'.format(option, section))
except Exception as e:
raise e
def __call__(self, section='DEFAULT', option=None, flag_eval=False, flag_bool=False):
"""
對象當(dāng)成函數(shù)使用的時候會默認(rèn)調(diào)用這個方法
這個方法可以實現(xiàn)上面多數(shù)功能
:param section:
:param option:
:param flag_eval: 如果為True 我們使用eval轉(zhuǎn)換類型
:param flag_bool: 如果為True 我們使用把數(shù)據(jù)轉(zhuǎn)換為bool
:return:
"""
if option is None:
return dict(self[section])
if isinstance(flag_bool, bool):
if flag_bool:
return self.getboolean(section, option)
else:
raise ValueError('{} must be type bool'.format(flag_bool))
data = self.get(section, option)
if data.isdigit():
return int(data)
try:
return float(data)
except Exception:
pass
if isinstance(flag_eval, bool):
if flag_eval:
return eval(data)
else:
raise ValueError('{} must be type bool'.format(flag_eval))
return data
if __name__ == '__main__':
conf = ParseConfigFile('configfile.ini')
print('所有的option', conf.get_all_option('FilePath'))
print('獲取section:{},option:{}對應(yīng)的數(shù)據(jù):{}'.
format('FilePath', 'TestCase', conf.get_option_value('FilePath', 'TestCase')))
print('獲取section:{}下所有的鍵值{}'.format('FilePath', conf.get_value('ExcelNum')))
print(conf())
print(conf(section='FilePath', option='TestCase'))
print(conf(option='a', flag_bool=True))
print(conf(section='ExcelNum', option='Actual_Column_Num', flag_eval=True))
1分鐘應(yīng)用到項目中
啥? 你還不知道怎么一分鐘應(yīng)用到項目中?
好吧,看來是逃不過去了。 我要說了..... 首先復(fù)制代碼,當(dāng)然你已經(jīng)知道上述代碼的含義, 在你的項目中新建py文件,拷貝代碼到你的文件中,ok接下來你可能已經(jīng)知道怎么用了。這能有1分鐘嗎?
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)爬取需要登錄的網(wǎng)站完整示例
這篇文章主要介紹了Python實現(xiàn)爬取需要登錄的網(wǎng)站,結(jié)合完整實例形式分析了Python登陸網(wǎng)站及數(shù)據(jù)抓取相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
使用pandas讀取表格數(shù)據(jù)并進(jìn)行單行數(shù)據(jù)拼接的詳細(xì)教程
這篇文章主要介紹了使用pandas讀取表格數(shù)據(jù)并進(jìn)行單行數(shù)據(jù)拼接的詳細(xì)教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
python如何處理matlab的mat數(shù)據(jù)
這篇文章主要介紹了python如何處理matlab的mat數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
selenium python 實現(xiàn)基本自動化測試的示例代碼
這篇文章主要介紹了selenium python 實現(xiàn)基本自動化測試的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
Python壓縮包處理模塊zipfile和py7zr操作代碼
目前對文件的壓縮和解壓縮比較常用的格式就是zip格式和7z格式,這篇文章主要介紹了Python壓縮包處理模塊zipfile和py7zr,需要的朋友可以參考下2022-06-06
解決安裝pycharm后不能執(zhí)行python腳本的問題
今天小編就為大家分享一篇解決安裝pycharm后不能執(zhí)行python腳本的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01

