天天看點

Python + Selenium: 使用webdriver判斷浏覽器是否關閉

在使用Selenium的過程中,偶然發現浏覽器意外關閉導緻意料之外的錯誤發生。比如重複啟動浏覽器。在無界面headless模式下,因為目前流行的浏覽器是多程序的,這是很難發現的。在渾然不知的情況下,多次重複啟動浏覽器而沒有正常關閉,很可能導緻多個浏覽器程序以“假死”的狀态滞留記憶體。“僵屍”程序占用浪費系統資源,堵塞其他程序,降低系統的性能。是以,需要合理正确的判斷且處理浏覽器狀态,并在必要時回收系統資源的方法。

由于Selenium中webdriver是直接管理浏覽器行為的實體,是以可以通過webdriver管理浏覽器行為的方法來簡單有效地鑒别其狀态。比如,webdriver的execute_script(javascript_string)方法。學習過Javascript的碼友想必知道,最簡單的Javascript代碼之一:

javascript:void(0);
           

它所表達的意義跟空集沒什麼兩樣。但是,它的作用卻是不容小觑。比如,最流行的是用在<a>标簽的href屬性,點選使用該方法的<a>标簽不跳轉和彈出新标簽頁。進而通過設定對應的Javascript腳本來響應點選事件。

<a href="javascript:void(0);" target="_blank" rel="external nofollow"  class="title">...</a>
           

 執行該腳本代碼沒有實際清晰的意義,它卻是完整的一行Javascript腳本代碼。如果通過webdriver啟動的浏覽器沒有關閉和出現異常,是可以正常執行該段代碼的。否則,浏覽器執行個體出現意料之外的問題。

from selenium import webdriver


object_existed = False
# driver = webdriver.Firefox()
# or driver = webdriver.Chrome()
if driver is not None:
    try:
        driver.execute_script('javascript:void(0);')
        object_existed = True
    except:
        # webdriver要求浏覽器執行Javascript出現異常
        try:
            driver.quit()
        finally:
            driver = None
    finally:
        pass
if not object_existed:
    # 浏覽器已關閉或标簽頁已關閉或其他異常
    ...
           

筆記:

        “javascript:void(0);”看似毫無意義,其實它的存在和數學裡的“0”和“空集”是一樣的,是不可或缺的。這也驗證了計算機科學與數學應用的關聯和一緻性。