一日一技:使用上下文管理器來強制關閉 Chromedriver

2021-02-20 未聞Code

當我們使用 Selenium 通過 Chromedriver 啟動 Chrome 瀏覽網頁時,可能會由於某些異常情況導致程序崩潰,但 Chromedriver 進程不會退出。

例如,我們編寫一段顯然有問題的代碼:

from selenium.webdriver import Chrome


driver = Chrome('./chromedriver')
driver.get('https://www.kingname.info')

1 + 'a' # 這一行代碼必定導致程序崩潰

代碼報錯以後,彈出的 Chrome 窗口不會自動關閉。並且 chromedriver 的進程也不會自動結束,如下圖所示:

這就會導致系統中出現越來越多的 chromedriver 進程,從而佔用大量的內存。

為了防止這種情況,我們必須想辦法,在任何情況下都需要保證退出 chromedriver。

你可能會使用一個超大型的 try ... except...把所有與 selenium 相關的代碼都包起來:

from selenium.webdriver import Chrome


driver = Chrome('./chromedriver')
try:
driver.get('https://www.kingname.info')
#第2行
#第3行
#第4行
#。。。
#第 n 行
except Exception:
driver.quit()

當然你也可以把具體的操作步驟放在函數裡面,然後 try...except... 把函數包住。但本質上是一樣的。

但這種超大型的 try...except...一是會導致程序速度減慢,二是程序出現了其他異常的時候,真正的報錯信息無法正常列印出來:

>>> a = {}
>>> try:
>>> a['k']
>>> except Exception as e:
>>> print(e)

當你看到這個沒頭沒尾的'k',你不知道是哪一行有問題,也不知道具體有什麼問題。

那麼,我們有沒有辦法,既不使用 try ... except ...,但是又能在程序崩潰的時候自動退出 chromedriver 呢?

這個時候我們就可以使用上下文管理器。

我們先來包裝一下 Selenium,實現一個帶有上下文管理器的類。創建一個SafeDriver.py文件:

from selenium.webdriver import Chrome


class SafeDriver:
def __init__(self):
self.driver = Chrome('./chromedriver')

def __enter__(self):
return self

def __exit__(self, exc_type, exc_val, exc_tb):
if self.driver:
self.driver.quit()

然後,我們在另一個程序裡面調用它:

from SafeDriver import SafeDriver

safe_driver = SafeDriver()
with safe_driver as driver:
driver.driver.get('https://www.kingname.info')
a = {}
a['k']

程序進入到with safe_driver as driver的縮進裡面,我們會得到一個driver變量,它可以用來操作瀏覽器。

我們只需要在縮進裡面正常寫代碼即可。一旦由於某種原因導致縮進裡面的代碼報錯,Python 自動會進入SafeDriver類的__exit__方法中,執行裡面的代碼。在這個方法裡面,我們就可以關閉 chromedriver。從而保證只要程序異常退出,瀏覽器一定會被關閉,不會遺留進程。

運行效果如下圖所示:

報錯信息和出錯的行數都能正常列印出來了。

我們來看看如何實現一個包含上下文管理器的程序:

增加__enter__(self)方法,定義進入上下文管理器時返回的內容增加__exit__(self, exc_type, exc_val, exc_tb)方法,定義退出上下文管理器時需要執行的代碼

需要注意的是,__enter__和__exit__需要成對使用,不能單獨使用其中一個。

在上面的代碼中,__enter__方法僅僅返回了self,於是,下面兩段代碼:

safe_driver = SafeDriver()

with safe_driver as instance:
pass

僅僅從功能上來說,instance 變量與safe_driver變量完全一樣,都可以使用safe_driver.driver和instance.driver。

所不同的是,使用with啟用上下文管理器以後,在退出縮進的時候會執行__exit__中的內容。

為了簡便起見,我們可以使用with safe_driver.driver as driver,直接拿到對象中的self.driver屬性,這樣可以直接使用類似於driver.get('https://www.kingname.info')訪問網站,而不是instance.driver.get('https://www.kingname.info')。少敲幾次鍵盤。


相關焦點

  • Win10全新功能曝光:除了強行關閉,還能直接卸載
    用戶在使用Windows系統時經常會用到任務管理器,它不僅可以用來查內存、CPU等使用情況,而且還能對部分佔用率較高造成系統卡頓的進程進行強制關閉
  • macOS系統:強制關閉電腦 第一章-007
    02.機器使用年代久遠,硬體老化。03.未知系統或者應用Bug衝突。今天給大家介紹幾種在系統卡頓、死機的情況下,自行排查問題、解決問題的方法。不至於因為機器死機而手足無措,進而耽誤正常工作。組合鍵「option+command+esc」,調出後臺運行的應用程式。選擇「未響應」的應用,強制退出。
  • Win10偷偷強制更新:關閉Update都沒用!
    2015年夏天,微軟正式發布了Win10,雖然該系統推出已有很長時間了,但是仍有很多人不願意升級,堅持使用方便快捷的Win7。
  • 谷歌又開始作妖:Chrome將隱藏地址欄/網址詳細內容
    未來當用戶使用谷歌瀏覽器加載網頁時可能只會顯示主域名,諸如網頁路徑層級以及URL後綴等內容都不再展示。目前只在金絲雀版中進行測試:在谷歌瀏覽器金最新的金絲雀版中實驗性選項裡增加上述內容,暫時只有用戶開啟這個實驗性選項後才生效隱藏。
  • 一日一技:直接在Chrome搜索單詞
    我們在日常使用電腦的過程中,可能會遇到需要查詢某個英文的中文意思或者某個中文對應的英文單詞。
  • 谷歌最新通知:這些設備將無法再使用新Chrome瀏覽器!
    換言之,就是這些老舊設備將無法再安裝使用新的Chrome瀏覽器。根據最新文檔,這些受影響的老舊設備都沒有對SSE3指令集的支持,主要是包含早於Intel Core 2 Duo和AMD Athlon 64處理器的設備。如果還有用戶在用這些上古CPU的話,那麼或許現在會是一個更新設備的契機。
  • 微軟推出Winstall.app:Windows軟體包管理器基於Web GUI
    微軟推出了Windows 軟體包管理器,可以說是微軟第一次為Windows 創建類似Linux 的軟體包管理器。  在當前形式下,Windows 軟體包管理器 「winget」是完全基於命令行的工具,可以從託管在GitHub上的集中式存儲庫中快速下載和安裝大量應用程式。但是,如果你不喜歡使用基於命令行的工具,第三方開發者 Mehedi Hassan 已經創建了winstall.app。
  • Win10 Build 18898發布:任務管理器新增磁碟類型標記
    Windows Insider團隊解釋稱:「對於擁有多個磁碟的用戶來說這非常有用,方便用戶進行區分。」除了任務管理器的改進之外,本次版本更新還引入了常規的質量修復,並且存在已知問題,完整更新日誌如下:PC端的常規調整、優化和修復:已知的問題
  • Chrome擴展推薦:你們的Chrome 69標籤欄字體變模糊了嗎?
    由於Chrome使用的上一代較低對比度的配置,因此新UI的標籤頁中的字體顯得有些模糊。有些用戶表示,這個文本模糊的問題目前除了降級到之前版本的瀏覽器外,似乎沒有其他解決方法。程式設計師Scott Hanselman是第一個在Twitter上發布有關這個問題的人。「文字不是黑色的。
  • 小技巧:為軟體讓路 關閉系統Win+快捷鍵
    一些軟體使用Win鍵加某個鍵作為快捷鍵來調用某個功能,但有時軟體中所用快捷鍵與系統快捷鍵發生衝突,造成軟體快捷鍵無法使用,尤其是早期開發的軟體與Windows
  • 一日一技:在Selenium中如何縮放網頁(不是窗口)
    我們知道,在Python中,可以設定窗口的大小:driver.set_window_size(1920,
  • 系統小技巧:巧用Win10資源管理器
    使用Windows 10資源管理器,除了常用的菜單命令、工具按鈕和右鍵菜單外,還有不少實用技巧可以利用。
  • 強制刪除涉案場所未經授權使用的44首歌曲
    據了解,葉某修與萬寧金某時尚娛樂會所、陵水某娛樂園、瓊海國某娛樂城等16家KTV娛樂場所之間的著作權權屬、侵權糾紛,海南一中院於2018年8月作出生效民事判決,認定上述16家KTV未經授權,使用《外婆的澎湖灣》《鄉間的小路》《爸爸的草鞋》《思念總在分手後》等44首歌曲從事商業經營活動,侵犯了葉某修的音樂作品著作權,海南一中院分別判決侵權的16家KTV娛樂會所,立即刪除其點播系統內44
  • 拯救你的舊電腦:能裝在U盤裡的作業系統-Chrome OS
    Chrome OS軟體結構極其簡單,可以理解為在Linux的內核上運行一個使用新的窗口系統的Chrome瀏覽器。對於開發人員來說,web就是平臺,所有現有的web應用可以完美的在Chrome OS中運行,開發者也可以用不同的開發語言為其開發新的web應用。
  • 警告:Chrome已變成流氓軟體
    舉個例子,Web 瀏覽器 Metastream的開發者 Samuel Maddock表示,在基於 Chromium項目開發自己瀏覽器的過程中,他發現需要一種名為Widevine的數字版權服務產品,在熬過了四個月和接連發送了10封電子郵件給Google之後,他得到了Google一句冰冷的回覆:對不起,你不能使用該軟體。
  • 蘋果:強行關閉iPhone的應用後臺,會導致電池壽命縮減
    來自外媒 Lad Bible 報導,蘋果透露強行關閉 iPhone 的應用後臺,會導致電池壽命縮減
  • Chinese delivery driver killed during work in Sydney
    Xiaojun Chen pictured with wife Lihong WeiA grieving widow and her two young children have been left with nothing after her husband died during his shift as a delivery driver.