为了重复使用一个已经打开的浏览器,可以根据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
https://github.com/SeleniumHQ/selenium/wiki/RemoteWebDriverh
ttps://github.com/SeleniumHQ/selenium/wiki/Grid2