二次封裝


1、二次封裝之前,先來復習下selenium的三種等待方式。

  1、sleep(強制等待,進程休眠)

    1、作用於局部。浪費時間。看情況使用。

  2、implicitly_wait(30)(隱式等待)

    1、作用於全局。

    2、需等待頁面完全加載完成,之后才會去查找元素。(游覽器左上角轉圈結束表示加載完成)

    3、如果頁面元素加載已完成。但是部分js之類的加載失敗(此時頁面轉圈是一直在轉的),會繼續加載,直到30s。

    4、且有切換頁面的時候。需加強制等待,不然會報錯。

    &一般自動化腳本不會用隱式等待

  3、WebDriverWait(顯示等待)    

    WebDriverWait(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)

    1、在a秒內,每間隔b秒內查詢一次。查詢到了就返回,沒查詢到就等待下一次查詢,超過a秒還未查詢到就拋出timeout異常。

    2、作用於局部

    3、格式如下:

      1、element = WebDriverWait(driver,10).until(lambda x: x.find_element_by_id("kw"))

      element.send_keys("xxx")

      注:對照上面,第一個參數self忽略,第二參數傳driver不用說,第三個參數timeout傳10,可以自行修改。第四個參數poll_frequency不修改默認0.5,可以自行修改。

      第五個ignored_exceptions默認忽略異常。(這里的x傳的是driver。lambda學過python基礎應該都知道)

      

  4、定位方法優化:

    我們常用的定位方法有find_element_by_id、by_name、by、xpath等等。但是這些我們可以統一用By方法來實現:

    from selenium.webdriver.common.by import By   ---首先導入by方法

    比如我們之前id定位就可以改成driver.find_element(By.ID,"值"),然后我們可以去看看By這個方法的源碼。

    

    其實我們寫的導入By,寫了個By.ID實際上等於引入了一個“id”而已。所以我們可以再優化一下,比如我們之前id定位就可以改成driver.find_element(“id”,"值"),其余幾種定位也是如此。

  

  5、現在我們就可以來封裝一個比如元素定位的方法了。

    1、新建一個類。Base,繼承object類。

    2、定義一個方法。比如findElement。

    

    注:loctor只是一個參數,不具備別的意義,你可以修改命名,self.t就是 poll_frequency。*號代表參數分開傳遞,學過python基礎的應該都知道。

    3、同時。self.driver,self.timeout,self.t這種都要用到的參數我們可以放在init初始函數里面,還可以設置個默認值,如下:----(如果你不寫在init里面就放在findelement里面傳也行。)

    

    4、這樣。一個基本的元素定位封裝就好了。但是現在問題還是很多的。比如。我們傳值不符合要求時,會報錯。我們可以來加個判斷。

    

    5、最后我們還可以打印一下定位的步驟。如下:

    

    這樣。一個較為成熟的元素定位的二次封裝的就完成了。且連日志都不需要再去寫了。

    之后。像click、sendkeys、clear啥的都這個基礎上進行就可以了。

    demo如下:

    

 

    

 

 
        

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM