selenium的運行時異常
selenium這個庫是一個偉大的庫,它賦予了程序員控制瀏覽器的能力。但是如果不理解這個庫的設計上的一些哲學,就會遇到很多問題。
selenium支持多種瀏覽器,但是這些瀏覽器裏面,只有firefox是完美支持的,所以,如果使用selenium優先使用firefox,這樣才能少踩坑。
selenium設計上最大的特點是:大量使用運行時異常而不是普通的異常。
運行時異常(RuntimeException)的特點可以用八個字來形容:無需捕捉,可以捕捉。
如下例,不捕捉RuntimeException也不會報錯(但是程序會終止),捕捉了也可以。
static void haha() {
throw new RuntimeException("怎麽這樣子");
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
try {
haha();
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用運行時異常有好處有壞處,好處是可以避免大量的try-catch,壞處是你不知道你所調用的函數什麽時候出問題、會出什麽問題,從而導致你的代碼有許多運行時才能暴露出來的問題。如果只有運行時才能發現問題,那跟Python、JavaScript之流又有什麽分別!
舉個例子:selenium在獲取元素時,findElement()函數如果找不到元素就會拋出運行時異常而不是返回null。
selenium在爬取https網站時,有時會卡死在 performing a tls hand shake,而selenium默認的timeout時間很長,最後也會拋出TimeoutException。這是selenium設計上的一大敗筆,運行時異常命名最好以RuntimeException結尾。
要想設置timeout,主要通過driver的manage().timeout()來設置,timeout有三種:
- 頁面加載時間
- 顯式等待時間:等待某種條件
- 隱式等待時間:固定等待一段時間
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
需要註意,頁面加載時間和隱式等待時間都是影響全局的。
最後,使用selenium一定要知道常用的參數有哪些,參數來源有兩處:
- firefox瀏覽器自身的參數
- 驅動的參數
驅動的參數可以參考
geckodriver
firefox參數可以參考
CSDN博客
selenium的運行時異常