可以定義一個(gè)類(lèi),類(lèi)里定義很多函數(shù)(主要用它做什么)或直接定義函數(shù)在一個(gè)py文件中

10年積累的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先制作網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有淶水免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
在另一個(gè)文件中導(dǎo)入這個(gè)那個(gè)py包,調(diào)用類(lèi)和方法
就是封裝了
這里來(lái)給大家演示一下,函數(shù)的定義或構(gòu)造,并調(diào)用函數(shù)來(lái)實(shí)現(xiàn)封裝后的效果。
首先我們來(lái)看看想實(shí)現(xiàn)下面的這個(gè)效果,如果不使用函數(shù)應(yīng)該怎么實(shí)現(xiàn)。
以上兩種返回結(jié)果都是1-9這幾個(gè)數(shù)字。
以上兩種方法,第一種代碼重復(fù)率太高,代碼美觀效果太差,雖然能實(shí)現(xiàn)效果,但是因?yàn)閿?shù)量比較少,還能手工打出來(lái)這幾行代碼,如果是打印1-100000就很難實(shí)現(xiàn)了。這時(shí)候for循環(huán)還是可以實(shí)現(xiàn)的,但是for循環(huán)只能實(shí)現(xiàn)類(lèi)似的數(shù)字和變量循環(huán),無(wú)法進(jìn)行復(fù)雜的功能開(kāi)發(fā)。鑒于此,函數(shù)這個(gè)概念就被python引入了,下面先來(lái)看看函數(shù)是怎么實(shí)現(xiàn)上面的效果的,還是兩種方法。
這時(shí)候如果想實(shí)現(xiàn)上面的打印結(jié)果就直接使用函數(shù)名+小括號(hào)調(diào)用函數(shù)就可以了,這種類(lèi)型的語(yǔ)法,不僅可以反復(fù)使用,而且封裝后的代碼更美觀。
年前走查腳本代碼時(shí),發(fā)現(xiàn)大家對(duì)selenium功能都在重復(fù)造輪子,而且容易出現(xiàn)一些常見(jiàn)低級(jí)bug。于是在閑暇之余,封裝一些常用的selenium功能。
在某些網(wǎng)頁(yè)中,存在多個(gè)frame嵌套。而selenium提供的find_element函數(shù)只能在當(dāng)前frame中查找,不能切換到其他frame中,需要從最上級(jí)frame中逐步切換(當(dāng)然也可以指定xpath的絕對(duì)路徑,但是一般沒(méi)人這么做)。在我們寫(xiě)代碼過(guò)程中,需要明確知道當(dāng)前frame位置和需要尋找元素的frame位置。在frame切換過(guò)程中,容易因?yàn)槭韬鰧?dǎo)致frame切換錯(cuò)誤導(dǎo)致元素?zé)o法找到的bug。
頁(yè)面中分布的frame,可以理解為樹(shù)狀結(jié)構(gòu)。因此我們可以采用遞歸的方式, 沿著某條搜索路線(xiàn)frame節(jié)點(diǎn),依次對(duì)樹(shù)中每個(gè)節(jié)點(diǎn)均做一次訪(fǎng)問(wèn)。
我們以163網(wǎng)址上的登錄框?yàn)槔狐c(diǎn)擊登錄按鈕,彈出登錄iframe頁(yè)面。輸入框位置在iframe中,因此我們不能使用xpath獲取元素位置,需要進(jìn)入iframe中,然后獲取元素。
手動(dòng)切換ifame可能會(huì)產(chǎn)生bug,因此需要一套自動(dòng)切換和檢索frame的機(jī)制。具體代碼如下:
需要注意的是:如果頁(yè)面中多個(gè)frame中,存在相同的xpath元素。還是需要指定frame的路徑,否則會(huì)返回搜索到的第一個(gè)元素。
強(qiáng)制等待
直接調(diào)用系統(tǒng)time.sleep函數(shù),不管頁(yè)面加載情況一定會(huì)等待指定的時(shí)間, 即使元素已被加載 。
1.如果設(shè)置的時(shí)間較長(zhǎng),會(huì)浪費(fèi)時(shí)間
2.如果設(shè)置的時(shí)間較短,元素可能沒(méi)有加載。
頁(yè)面中某元素如果未能立即加載,隱式等待告訴WebDriver需等待一定的時(shí)間,然后去查找元素。默認(rèn)不等待,隱式等待作用于整個(gè)WebDriver周期,只需設(shè)置一次即可。
1.在上文的find_element函數(shù)中,采用遞歸方式在所有frame尋找元素。若采用隱式等待,則在每個(gè)frame中都需要等待設(shè)定的時(shí)間,耗時(shí)非常長(zhǎng)。
2.某些頁(yè)面我們想要的元素已經(jīng)加載完畢,但是部分其他資源未加載。隱式等待必須等待所有元素加載完畢,增加額外等待時(shí)間。
顯示等待一般作用于某一個(gè)元素,在設(shè)定的時(shí)間范圍內(nèi),默認(rèn)每間隔0.5秒查找元素。返回被加載的元素,若超過(guò)設(shè)定的時(shí)間范圍未能查找則報(bào)錯(cuò)。顯示等待作為selenium常用的等待機(jī)制,我們來(lái)看下他的源碼和機(jī)制。
driver 注釋中解釋為WebDriver實(shí)例,但是代碼中并未有相關(guān)檢測(cè),因此可以傳入任何對(duì)象
但是__repr__函數(shù)中使用到session_id屬性,如果需要顯示屬性或者轉(zhuǎn)為str對(duì)象,最好在driver對(duì)象中添加session_id屬性
在until函數(shù)中,我們可以看到driver對(duì)象傳入method函數(shù)。在計(jì)時(shí)結(jié)束前,在不斷循環(huán)執(zhí)行method函數(shù),如果method函數(shù)有正常返回值則退出循環(huán),否則報(bào)TimeoutException錯(cuò)誤。
可以采用裝飾器對(duì)隱式等待進(jìn)行封裝,這樣代碼更加精簡(jiǎn)
同樣的,采用裝飾器對(duì)其他常用的函數(shù)進(jìn)行封裝,例如強(qiáng)制等待、點(diǎn)擊、輸入文本等。
裝飾器雖然很方便,但也會(huì)產(chǎn)生一些麻煩。例如在find_element函數(shù)遞歸調(diào)用過(guò)程中,理應(yīng)只要執(zhí)行一次裝飾器函數(shù)。但因?yàn)檠b飾器已經(jīng)裝飾完畢,導(dǎo)致每次遞歸都會(huì)執(zhí)行。例如強(qiáng)制等待的sleep函數(shù),如果遞歸次數(shù)越多等待時(shí)間越長(zhǎng)。
解除裝飾器一般有兩種做法:一是約定參數(shù),當(dāng)遞歸第二次調(diào)用時(shí)則不生效。例如
這種方式實(shí)現(xiàn)簡(jiǎn)單,容易理解。但是增加了參數(shù)限制,在fun函數(shù)中就不能使用first_sleep參數(shù)。
二是采用裝飾器采用wrapped實(shí)現(xiàn),通過(guò)訪(fǎng)問(wèn)wrapped屬性獲得原始函數(shù)。例如
但是某一個(gè)函數(shù)被多個(gè)裝飾器裝飾時(shí),需要遞歸解除裝飾器。例如
最后整體代碼如下
這次的封裝其實(shí)還存在很多問(wèn)題
1.find_element函數(shù)不僅僅只是提供查找元素功能,還提供一些其他功能,因此叫element_operation更為合適。
2.find_element函數(shù)的參數(shù)過(guò)多,并且很多參數(shù)的使用并不在函數(shù)本身中,對(duì)代碼閱讀很不友好。
3.得小心避免參數(shù)重復(fù)問(wèn)題,假設(shè)裝飾器sleep和裝飾器wait_time都使用time這個(gè)參數(shù),將無(wú)法區(qū)分具體是哪個(gè)函數(shù)使用。
4.不利于擴(kuò)展和維護(hù),當(dāng)功能過(guò)多時(shí)find_element的參數(shù)過(guò)于龐大。
如果只是簡(jiǎn)單地封裝和使用,上面這種方式也能達(dá)到較好的效果。如果想進(jìn)一步封裝,建議采用鏈?zhǔn)秸{(diào)用方式,裝飾器輔助封裝。例如
這樣函數(shù)的擴(kuò)展性和可閱讀性有較大的提升
當(dāng)前題目:python封裝函數(shù)調(diào)用 python封裝模塊與調(diào)用
網(wǎng)站URL:http://www.yijiale78.com/article4/docjcoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、動(dòng)態(tài)網(wǎng)站、標(biāo)簽優(yōu)化、App開(kāi)發(fā)、企業(yè)建站、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)