webdriver使用已打開過的chrome


基本功能:

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

附加:

如果已打開的chrome未關閉,則在chrome中新建標簽頁來打開新的頁面。
如果已打開的chrome已關閉,則新啟瀏覽器。

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

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

20190830170629375

根本不知道誰是誰。

於是就想到要實現前面提到的這些功能。

首先要解決的第一個問題就是,怎么重新使用已打開的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還存在呀,所以還是多理清思路,才能避免走冤枉路。

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

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()

版權申明:本文為博主原創文章,轉載請保留原文鏈接及作者。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM