宿松網(wǎng)站建設(shè)青島關(guān)鍵詞排名哪家好
?
?
😏作者簡介:博主是一位測試管理者,同時(shí)也是一名對(duì)外企業(yè)兼職講師。
📡主頁地址:【Austin_zhai】
🙆目的與景愿:旨在于能幫助更多的測試行業(yè)人員提升軟硬技能,分享行業(yè)相關(guān)最新信息。
💎聲明:博主日常工作較為繁忙,文章會(huì)不定期更新,各類行業(yè)或職場問題歡迎大家私信,有空必回。

?
?
閱讀目錄
- 1. 目的
- 2. 管理方法
- 3. 配置方法
- 4. 方法實(shí)現(xiàn)
- 5. 使用注意點(diǎn)
1. 目的
??web自動(dòng)化測試作為軟件自動(dòng)化測試領(lǐng)域中繞不過去的一個(gè)“香餑餑”,通常都會(huì)作為廣大測試從業(yè)者的首選學(xué)習(xí)對(duì)象,相較于C/S架構(gòu)的自動(dòng)化來說,B/S有著其無法忽視的諸多優(yōu)勢,從行業(yè)發(fā)展趨、研發(fā)模式特點(diǎn)、測試工具支持,其整體的完整生態(tài)已經(jīng)遠(yuǎn)遠(yuǎn)超過了C/S架構(gòu)方面的測試價(jià)值。
??接下來我們在上一次的基礎(chǔ)之上,對(duì)已經(jīng)初具雛形的自動(dòng)化代碼進(jìn)行補(bǔ)充和優(yōu)化,利用python的特性來對(duì)定位元素的管理方法進(jìn)行設(shè)計(jì)并講解其中的思路與注意點(diǎn)。
?
?
2. 管理方法
??一般來說,界面元素的信息管理方法比較常見的有配置文件、持久化、專項(xiàng)平臺(tái)和工具等。如何取舍大家也是眾說紛紜,但既然我們使用了python這門語言,那么就要好好利用其優(yōu)勢,將管理的成本(人力、耗時(shí)等)降到最低。相較于一般文本,我們可以使用ini格式的配置文件來對(duì)已知曉具體信息的元素進(jìn)行統(tǒng)一的管理,將業(yè)務(wù)代碼與界面元素進(jìn)行有效分離,減少后期因需求變動(dòng)而發(fā)生的大量維護(hù)工作。
??通過以上所說的方法,我們可以將大部分常用的元素信息錄入進(jìn)配置文件,即使后期產(chǎn)品或項(xiàng)目發(fā)生了變更,我們也可以靈活應(yīng)對(duì)。舉個(gè)例子,如果產(chǎn)品或項(xiàng)目發(fā)生了邏輯與功能的變更,那么我們只修改業(yè)務(wù)代碼即可;若是發(fā)生了UI變更,我們也只需要修改對(duì)應(yīng)的配置文件。這樣的低耦合自動(dòng)化框架才可以有效的提升日常的測試團(tuán)隊(duì)工作效率。
??另外,鑒于大部分團(tuán)隊(duì)內(nèi)會(huì)有多名測開角色的存在,在定義配置文件之初,也應(yīng)該有效的開展團(tuán)隊(duì)內(nèi)的討論,將配置文件的一些總要因素(編寫與命名規(guī)范、存放路徑等)進(jìn)行充分的認(rèn)知統(tǒng)一與整合。以防在后期使用時(shí)出現(xiàn)元素名不同而無法找到等等諸如此類的低級(jí)錯(cuò)誤。
?
?
3. 配置方法
??接下來我們先來看下一般的配置文件內(nèi)都需要寫哪些內(nèi)容,下圖展示的是登錄頁面的相關(guān)元素定位信息,這里還是給大家說一下,如果系統(tǒng)的規(guī)模不是太大的話建議還是把所有的元素信息放在一個(gè)配置文件內(nèi)進(jìn)行管理,不宜進(jìn)行多路徑多文件的分散處理。
??文件的格式基本就是ini的配置格式,內(nèi)容由多個(gè)section構(gòu)成(方括號(hào)內(nèi)),每個(gè)section內(nèi)可以存在多個(gè)配置項(xiàng),每一條配置項(xiàng)由配置項(xiàng)名稱、定位方法、定位值組成。配置項(xiàng)名稱不用多解釋,在代碼中會(huì)直接使用到,可以簡單的理解為類似變量名,后面的id則是定位方法,這里不拘泥于id,如果要使用其他的定位方式,改成對(duì)應(yīng)的方法即可,具體的定位方法可以參看前一篇中的get_element方法。當(dāng)中的冒號(hào)則只是方便后期在業(yè)務(wù)代碼中進(jìn)行取值的分割,不強(qiáng)制使用冒號(hào),其他符號(hào)均可。最后的是定位值,也就是開發(fā)同學(xué)在開發(fā)界面中各類元素的對(duì)應(yīng)屬性的屬性值,這里要注意的是,值必須和你前面指定的方法相對(duì)應(yīng),千萬不能搞錯(cuò)。
?
這里舉個(gè)簡單的例子,比如LoginPageElement類中有一個(gè)get_element的方法,那我們將原有的業(yè)務(wù)代碼內(nèi)元素轉(zhuǎn)化為配置文件的方法為:
log_pg_ele = LoginPageElement('chrome')
log_pg_ele.get_element('id', 'transaction_log_treaty')
?
??是不是很簡單,因?yàn)樵谠械膅et_element方法內(nèi),我們已經(jīng)定義了相關(guān)的定位方法與定位值這兩個(gè)參數(shù),所以根據(jù)配置文件的配置項(xiàng)組成方式可以進(jìn)行無縫轉(zhuǎn)換,無須再進(jìn)行額外的操作。
?
?
4. 方法實(shí)現(xiàn)
??有了對(duì)應(yīng)的配置文件,我們就可以使用python來設(shè)計(jì)實(shí)現(xiàn)相關(guān)的配置解析與元素調(diào)用方法。這里我們先將對(duì)應(yīng)的ini文件創(chuàng)建在各自項(xiàng)目指定的目錄中,再啰嗦一次,如果是團(tuán)隊(duì)公用,文件名與存放路徑需要統(tǒng)一。
??假設(shè)我的配置文件名為FundManSys.ini,存放在項(xiàng)目的conf文件夾下。我們在使用python解析配置文件之前,需要先安裝對(duì)應(yīng)的功能模塊。這里我們使用configparser這個(gè)庫,它可以讀取解析我們一般的ini類配置文件。
??無論是python interpreter亦或是pip install都可以,安裝完成之后我們開始進(jìn)行整體的功能設(shè)計(jì)與實(shí)現(xiàn)。
??首先,我們先將讀取配置文件的功能進(jìn)行實(shí)現(xiàn)。這里我創(chuàng)建了一個(gè)類,但沒有寫出來,我們直接展示其內(nèi)的方法,名字什么的大家可以自由發(fā)揮, 構(gòu)造函數(shù)中將需要指定的節(jié)點(diǎn)名稱帶入,如果不指定名稱,則帶入特定值。第二段代碼通過調(diào)用方法ConfigParser來讀取解析配置文件,read()內(nèi)填寫配置文件的路徑與文件名,這里設(shè)置了變量,最后將整個(gè)對(duì)象返回出來。
def __init__(self, section=None):if section:self.section = sectionelse:self.section = 'business_log_v2'def load_ini(self):cf = configparser.ConfigParser()cf.read(ini_file)return cf
?
??那么取得對(duì)象之后我們?nèi)绾握{(diào)用里面的信息呢,接下來就需要對(duì)其內(nèi)進(jìn)行進(jìn)一步的處理實(shí)現(xiàn)。這里使用了鏈?zhǔn)綄懛?#xff0c;不這么寫的話也可以在構(gòu)造函數(shù)中的定義一個(gè)變量來接收load_ini方法中返回的對(duì)象。section和key兩個(gè)參數(shù)也不用多說了吧,分別對(duì)應(yīng)的已經(jīng)很明顯了。
def get_data(self, key):data = self.load_ini().get(self.section, key)return data
?
??基本的配置文件解析功能就設(shè)計(jì)封裝好了,是不是很簡單?那么我們拿到想要數(shù)據(jù)之后如何實(shí)際結(jié)合至現(xiàn)有的元素操作代碼中去呢,緊接著我們就可以開始將業(yè)務(wù)代碼與實(shí)際配置功能進(jìn)行對(duì)接了。
??我們把之前設(shè)計(jì)的get_element方法進(jìn)行優(yōu)化,添加取得數(shù)據(jù)并處理的操作。
這里實(shí)例化的load_ini因?yàn)闆]有指定節(jié)點(diǎn)名,就會(huì)默認(rèn)使用business_log_v2
節(jié)點(diǎn)名。這里已經(jīng)將原來的方法參數(shù)進(jìn)行變更,可以看到變更后的參數(shù)變少了,原有的by與ele兩個(gè)參數(shù)也被配置項(xiàng)中的定位方法與定位值所替代,這也就是我們要達(dá)到的目的。具體變化大家可以對(duì)比前一篇中的get_element方法。
def get_element(self, key):element = Noneload_ini = EleConfiguration()data = load_ini.get_data(key)by, ele = data.split(':')try:if by == 'id':element = self.driver.find_element(By.ID, ele)elif by == 'name':element = self.driver.find_element(By.NAME, ele)elif by == 'css':element = self.driver.find_element(By.CSS_SELECTOR, ele)elif by == 'class':element = self.driver.find_element(By.CLASS_NAME, ele)else:element = self.driver.find_element(By.XPATH, ele)except:session.add(ele_err_msg)session.commit()return element
?
??至此我們的整體配置管理設(shè)計(jì)已經(jīng)完成,真實(shí)的使用過程中我們只需要根據(jù)自己的實(shí)際場景進(jìn)行頁面業(yè)務(wù)邏輯的代碼編寫即可,無論是何種界面業(yè)務(wù)操作都可以直接實(shí)例化并調(diào)用get_element方法來進(jìn)行元素定位了,并且由于真實(shí)元素信息與業(yè)務(wù)代碼分開的關(guān)系,整體的可讀性與維護(hù)性也是大大提升。
?
?
5. 使用注意點(diǎn)
1.python2與3的版本內(nèi)configparser模塊的名字不同,有大小寫之分,需要注意,2是ConfigParser,3是configparser;
2.配置項(xiàng)內(nèi)的鍵值對(duì)如果連接符號(hào)使用冒號(hào),注意中英文狀態(tài),以免出現(xiàn)使用中文冒號(hào)而意外報(bào)錯(cuò)的情況出現(xiàn);
3.配置文件中不要設(shè)置過多的section名,過多的名稱容易讓配置文件的內(nèi)容過于混亂,不予與維護(hù);
4.與其說注意更不如說是規(guī)范,配置文件內(nèi)的各類名稱盡量都使用英文來定義,和編寫代碼的命名意義差不多,拼音不應(yīng)該出現(xiàn)在此類的配置文件內(nèi)。