最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python如何解析配置文件并應(yīng)用到項(xiàng)目中

 更新時(shí)間:2019年06月27日 09:48:19   作者:linux超  
這篇文章主要介紹了python如何解析配置文件并應(yīng)用到項(xiàng)目中,如果我們更換了電腦也可以繼續(xù)使用原來(lái)的文件,只要把里面的數(shù)據(jù)拷貝到游戲執(zhí)行的配置文件里面就可以了,我們重新再進(jìn)入就不用重新設(shè)置內(nèi)掛的配置了,需要的朋友可以參考下

配置文件的類(lèi)型

通常自動(dòng)化測(cè)試中的配置文件是以.ini 和 .conf 為后綴的文件

配置文件的組成

1.section

2.option

3.value

配置文件的格式

[section_name]
# =號(hào)可以使用:號(hào)代替
option_name=value

配置文件的注釋

通常使用#號(hào)或者;分號(hào)注釋?zhuān)幸稽c(diǎn)一定要注意,注釋最好不要寫(xiě)到option_name=value行的后面,否則你會(huì)遇到意想不到的錯(cuò)誤

配置文件的作用

那么我們的配置文件主要來(lái)干些什么呢?

1.可以存儲(chǔ)測(cè)試中測(cè)試用例使用的測(cè)試數(shù)據(jù)

2.可以存儲(chǔ)測(cè)試中用到的資源數(shù)據(jù),比如數(shù)據(jù)庫(kù)的地址,用戶(hù),密碼等等

3.可以作為ui對(duì)象庫(kù)使用,存儲(chǔ)我們ui自動(dòng)化測(cè)試項(xiàng)目中的頁(yè)面元素信息

4.可以存儲(chǔ)項(xiàng)目使用的全局變量,比如項(xiàng)目的根目錄,日志,報(bào)告的路徑等等

以上這些數(shù)據(jù)均可以存放在配置文件中,方便的我們讀取,當(dāng)項(xiàng)目的一些配置信息改變時(shí),我們只要修改配置文件即可,而不用修改具體代碼,大大減小項(xiàng)目的維護(hù)成本!

ok,既然我都標(biāo)題黨了,那么現(xiàn)在就告訴你怎么1分鐘應(yīng)用到項(xiàng)目中。有配置文件我們必定要先解析文件才行,我們現(xiàn)在有這樣一個(gè)配置文件,存放如下內(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()='確 定']

封裝代碼

下面這個(gè)封裝是我之前寫(xiě)的,不算是很通用的功能,但是如果你的配置文件和我上面的一樣用來(lái)存儲(chǔ)ui對(duì)象庫(kù)的話(huà)就完全適用了。

"""
------------------------------------
@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() # 獲取配置文件對(duì)象
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:
# 我配置文件是用這個(gè)符號(hào)來(lái)分割的,所有解析的時(shí)候要使用這個(gè)符號(hào)分割,得到元素
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鍵對(duì)應(yīng)的value
def getAllSections(self):
try:
all_sections = self.cf.sections()
except Exception as e:
raise e
else:
return all_sections # 所有的sections返回值是個(gè)列表
if __name__=='__main__':
cf = ParseConfigFile()
locator = cf.getElementValue('126mail_login','loginPage.username')
print(locator)
print(cf.getItemsSection('126mail_login'))
print(cf.getAllSections())

封裝改進(jìn)

下面的封裝幾乎可以完成任何自動(dòng)化測(cè)試項(xiàng)目中配置文件存儲(chǔ)任何數(shù)據(jù)類(lèi)型的數(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,返回一個(gè)字典"""
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對(duì)應(yīng)的數(shù)據(jù)
如果option對(duì)應(yīng)數(shù)據(jù)為數(shù)字,則自動(dòng)轉(zhuǎn)換為int或者float
如果option對(duì)應(yīng)的數(shù)據(jù)是個(gè)可以使用eval轉(zhuǎn)換的類(lèi)型,則傳遞flag為T(mén)rue時(shí),自動(dòng)轉(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):
"""
對(duì)象當(dāng)成函數(shù)使用的時(shí)候會(huì)默認(rèn)調(diào)用這個(gè)方法
這個(gè)方法可以實(shí)現(xiàn)上面多數(shù)功能
:param section:
:param option:
:param flag_eval: 如果為T(mén)rue 我們使用eval轉(zhuǎn)換類(lèi)型
:param flag_bool: 如果為T(mén)rue 我們使用把數(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:{}對(duì)應(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)用到項(xiàng)目中

啥? 你還不知道怎么一分鐘應(yīng)用到項(xiàng)目中?

好吧,看來(lái)是逃不過(guò)去了。 我要說(shuō)了..... 首先復(fù)制代碼,當(dāng)然你已經(jīng)知道上述代碼的含義, 在你的項(xiàng)目中新建py文件,拷貝代碼到你的文件中,ok接下來(lái)你可能已經(jīng)知道怎么用了。這能有1分鐘嗎?

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python?OpenCV實(shí)現(xiàn)3種濾鏡效果實(shí)例

    Python?OpenCV實(shí)現(xiàn)3種濾鏡效果實(shí)例

    opencv是一個(gè)很強(qiáng)大的庫(kù),支持多個(gè)編程語(yǔ)言,下面這篇文章主要給大家介紹了關(guān)于Python?OpenCV實(shí)現(xiàn)3種濾鏡效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Python使用whisper實(shí)現(xiàn)語(yǔ)音識(shí)別(ASR)的示例代碼

    Python使用whisper實(shí)現(xiàn)語(yǔ)音識(shí)別(ASR)的示例代碼

    Whisper是OpenAI的一個(gè)強(qiáng)大的語(yǔ)音識(shí)別庫(kù),支持離線(xiàn)的語(yǔ)音識(shí)別,本文主要介紹了Python使用whisper實(shí)現(xiàn)語(yǔ)音識(shí)別(ASR)的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Python機(jī)器視覺(jué)之基于OpenCV的手勢(shì)檢測(cè)

    Python機(jī)器視覺(jué)之基于OpenCV的手勢(shì)檢測(cè)

    這篇文章主要為大家介紹了一個(gè)機(jī)器視覺(jué)項(xiàng)目:基于OpenCV的手勢(shì)檢測(cè),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python和OpenCV有一定的幫助,感興趣的可以跟隨小編學(xué)習(xí)一下
    2021-12-12
  • 詳解python實(shí)現(xiàn)識(shí)別手寫(xiě)MNIST數(shù)字集的程序

    詳解python實(shí)現(xiàn)識(shí)別手寫(xiě)MNIST數(shù)字集的程序

    這篇文章主要介紹了詳解python實(shí)現(xiàn)識(shí)別手寫(xiě)MNIST數(shù)字集的程序,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 使用Python實(shí)現(xiàn)密碼與驗(yàn)證碼的MD5加密

    使用Python實(shí)現(xiàn)密碼與驗(yàn)證碼的MD5加密

    在現(xiàn)代軟件開(kāi)發(fā)中,數(shù)據(jù)加密是一個(gè)非常重要的環(huán)節(jié),無(wú)論是用戶(hù)密碼、驗(yàn)證碼,還是其他敏感信息,加密都是保護(hù)數(shù)據(jù)安全的關(guān)鍵手段之一,本文將通過(guò)一個(gè)具體的例子,詳細(xì)講解如何使用 Python 實(shí)現(xiàn)密碼與驗(yàn)證碼的 MD5 加密
    2025-02-02
  • Python基礎(chǔ)之函數(shù)嵌套知識(shí)總結(jié)

    Python基礎(chǔ)之函數(shù)嵌套知識(shí)總結(jié)

    今天帶大家回顧python基礎(chǔ)知識(shí),文中對(duì)Python函數(shù)嵌套作了非常詳細(xì)的知識(shí)總結(jié),對(duì)正在學(xué)習(xí)python基礎(chǔ)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Python如何使用神經(jīng)網(wǎng)絡(luò)進(jìn)行簡(jiǎn)單文本分類(lèi)

    Python如何使用神經(jīng)網(wǎng)絡(luò)進(jìn)行簡(jiǎn)單文本分類(lèi)

    這篇文章主要介紹了Python如何使用神經(jīng)網(wǎng)絡(luò)進(jìn)行簡(jiǎn)單文本分類(lèi),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-02-02
  • python3.6編寫(xiě)的單元測(cè)試示例

    python3.6編寫(xiě)的單元測(cè)試示例

    這篇文章主要介紹了python3.6編寫(xiě)的單元測(cè)試,結(jié)合實(shí)例形式分析了Python3.6使用unittest模塊進(jìn)行單元測(cè)試的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • cython加速python代碼的方法實(shí)現(xiàn)

    cython加速python代碼的方法實(shí)現(xiàn)

    本文主要介紹了cython加速python代碼的方法實(shí)現(xiàn),特別是在涉及到數(shù)值計(jì)算密集型任務(wù)時(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 使用Python實(shí)現(xiàn)MP4轉(zhuǎn)GIF

    使用Python實(shí)現(xiàn)MP4轉(zhuǎn)GIF

    在日常生活中,我們經(jīng)常會(huì)遇到需要將 MP4 文件轉(zhuǎn)換為 GIF 文件的需求,本文將介紹一種使用 Python 實(shí)現(xiàn) MP4 轉(zhuǎn) GIF 程序的方法,這種方法簡(jiǎn)單易學(xué),而且完全免費(fèi),需要的可以參考下
    2023-12-12

最新評(píng)論

云林县| 库车县| 酉阳| 邢台市| 元朗区| 柘荣县| 开封市| 自治县| 蒙山县| 福鼎市| 凤阳县| 库车县| 西盟| 龙川县| 苏尼特右旗| 安康市| 西乌| 清河县| 赤城县| 福海县| 乳源| 临沧市| 罗江县| 泰安市| 五台县| 大方县| 佛山市| 开化县| 大安市| 天气| 永善县| 建阳市| 集安市| 成武县| 瑞丽市| 通河县| 万州区| 洱源县| 宁河县| 崇义县| 巴塘县|