webdriver使用已打開過的chrome

基本功能:python

執行腳本a,打開一個chrome,腳本a執行完成,chrome未關閉。
執行腳本b,繼續使用a打開的chrome,不新啓瀏覽器。

附加:web

若是已打開的chrome未關閉,則在chrome中新建標籤頁來打開新的頁面。
若是已打開的chrome已關閉,則新啓瀏覽器。

最近用python+selenium+pytest,寫了個測試小工具用來自動化登錄瀏覽器,一方面是方便管理網址、帳號、密碼,存放在腳本中,另外一方面也省去了頻繁輸入登錄網站的操做,節省了很多時間。chrome

但這個小工具用起來存在明顯問題:每次都新啓一個瀏覽器,多了後就是這樣的瀏覽器

20190830170629375

根本不知道誰是誰。session

因而就想到要實現前面提到的這些功能。工具

首先要解決的第一個問題就是,怎麼從新使用已打開的chrome。百度後知曉,是經過session_id。瀏覽器都有一個session_id,拿到這個session_id就能夠經過webdriver.Remote去調chrome。測試

driver = webdriver.Chrome()
params["session_id"] = driver.session_id
params["server_url"] = driver.command_executor._url

driver = webdriver.Remote(command_executor=params["server_url"])
driver.session_id = params["session_id"]

通過試驗,python存在一個坑是每次初始化就會調start_session去新開一個空白的瀏覽器。網上有解決方案是繼承Remote,重寫start_session方法。然而,仔細看完代碼就發現,何須畫蛇添足,直接quit()就搞定。網站

driver = webdriver.Remote(command_executor=params["server_url"])
driver.quit()  # 退出start_session新開的空白瀏覽器
driver.session_id = params["session_id"]

quit是quit了,但driver還存在呀,因此仍是多理清思路,才能避免走冤枉路。ui

而後要解決的第二個問題就是,如何在執行腳本b的時候再接着用session。固然就是存本地咯。這裏用到的是pickle,能很方便的在本地存取變量。url

with open(session_file, 'wb') as f:
    pickle.dump(params, f)

with open(session_file, 'rb') as f:
    params = pickle.load(f)

第三個問題就是新開標籤頁和切換窗口。

driver.execute_script('window.open("");')  # 調js
driver.switch_to.window(driver.window_handles[-1])  # 切換到最後一個頁籤

最後要解決的一個問題就是,若是已經打開的chrome關掉了,從本地文件讀取的session就會過期。拿這個過期session去用,就會」chrome not reachable「。解決思路就是,捕獲driver拋出的WebDriverException,從新建立新的driver。

try:
    driver = webdriver.Remote(command_executor=params["server_url"])
    driver.quit()  # 退出start_session新開的空白瀏覽器
    driver.session_id = params["session_id"]
    driver.execute_script('window.open("");')
    driver.switch_to.window(driver.window_handles[-1])
except:
    driver = create_driver()

完整代碼

session_file = 'browser_session.data'


def create_driver():
    driver = webdriver.Chrome()
    with open(session_file, 'wb') as f:
        params = {"session_id": driver.session_id, "server_url": driver.command_executor._url}
        pickle.dump(params, f)
    return driver

  
if not Path(session_file).exists():
    driver = create_driver()
else:
    with open(session_file, 'rb') as f:
        params = pickle.load(f)
        try:
            driver = webdriver.Remote(command_executor=params["server_url"])
            driver.quit()  # 退出start_session新開的空白瀏覽器
            driver.session_id = params["session_id"]
            driver.execute_script('window.open("");')
            driver.switch_to.window(driver.window_handles[-1])
        except:
            driver = create_driver()

<font color=red>版權申明:本文爲博主原創文章,轉載請保留原文連接及做者。</font>

相關文章
相關標籤/搜索