基本功能:
執行腳本a,打開一個chrome,腳本a執行完成,chrome未關閉。
執行腳本b,繼續使用a打開的chrome,不新啟瀏覽器。
附加:
如果已打開的chrome未關閉,則在chrome中新建標簽頁來打開新的頁面。
如果已打開的chrome已關閉,則新啟瀏覽器。
最近用python+selenium+pytest,寫了個測試小工具用來自動化登陸瀏覽器,一方面是方便管理網址、賬號、密碼,存放在腳本中,另一方面也省去了頻繁輸入登陸網站的操作,節省了不少時間。
但這個小工具用起來存在明顯問題:每次都新啟一個瀏覽器,多了后就是這樣的

根本不知道誰是誰。
於是就想到要實現前面提到的這些功能。
首先要解決的第一個問題就是,怎么重新使用已打開的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()
版權申明:本文為博主原創文章,轉載請保留原文鏈接及作者。
