為了重複使用一個已經打開的浏覽器,可以根據
executor_url
和
session_id
來重新擷取浏覽器的控制權。
開啟遠端Hub服務
下載下傳jar包:https://www.seleniumhq.org/download/
運作:
java -jar selenium-server-standalone-3.141.59.jar
運作測試腳本:
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
driver = webdriver.Remote(command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.CHROME)
driver.get("http://www.baidu.com")
executor_url = driver.command_executor._url
session_id = driver.session_id
print(executor_url)
print(session_id)
結果:
http://127.0.0.1:4444/wd/hub
52bac4f63e2794e5e68481b6e0ce7a8c
現在就可以打開:http://127.0.0.1:4444/wd/hub/ 檢視所有已經打開的session。

重寫Remote
selenium的Remote每次都要建立一個session,這樣就無法使用已經打開的session_id,是以我們要重寫Remote。
from selenium.webdriver import Remote
from selenium.webdriver.chrome import options
from selenium.common.exceptions import InvalidArgumentException
class ReuseChrome(Remote):
def __init__(self, command_executor, session_id):
self.r_session_id = session_id
Remote.__init__(self, command_executor=command_executor, desired_capabilities={})
def start_session(self, capabilities, browser_profile=None):
"""
重寫start_session方法
"""
if not isinstance(capabilities, dict):
raise InvalidArgumentException("Capabilities must be a dictionary")
if browser_profile:
if "moz:firefoxOptions" in capabilities:
capabilities["moz:firefoxOptions"]["profile"] = browser_profile.encoded
else:
capabilities.update({'firefox_profile': browser_profile.encoded})
self.capabilities = options.Options().to_capabilities()
self.session_id = self.r_session_id
self.w3c = False
測試
driver2 = ReuseChrome(command_executor="http://127.0.0.1:4444/wd/hub",
session_id="52bac4f63e2794e5e68481b6e0ce7a8c")
# 列印current_url為百度的位址,說明複用成功
print(driver2.current_url)
driver2.get("http://www.sina.com")
參考
http://www.spiderpy.cn/blog/detail/36