天天看點

Selenium重複使用遠端打開的Remote Chrome浏覽器

為了重複使用一個已經打開的浏覽器,可以根據​

​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。

Selenium重複使用遠端打開的Remote Chrome浏覽器

重寫Remote

selenium的Remote每次都要建立一個session,這樣就無法使用已經打開的session_id,是以我們要重寫Remote。

Selenium重複使用遠端打開的Remote Chrome浏覽器
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​​

繼續閱讀