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如下: