该方法只适用不同脚本执行未关闭的浏览器操作的需求,
使用固定端口,即启动chromedriver.exe时,指定端口号9515为访问端口(selenium不指定时默认随机端口号)以获取该页面的session,然后利用重写的start_session方法重新获取webdriver
以下代码只记录该操作:
#!/usr/bin/env python # -*- coding: utf-8 -*- # Author: from selenium import webdriver from selenium.webdriver import Remote from selenium.webdriver.chrome import options from selenium.common.exceptions import InvalidArgumentException from selenium.webdriver.common.desired_capabilities import DesiredCapabilities import os import sys import time import urllib.request import json import getpass # 获取驱动路径,默认为脚本上两层目录 script_path = sys.argv[0] # print(script_path) dirver_path = os.path.dirname(os.path.dirname(os.path.dirname(script_path))) + "/chromedriver.exe" # print(dirver_path) driver_url = "http://127.0.0.1:9515" driver = "" # 网上找的重写start_session方法 class ReuseChrome_Class(Remote): def __init__(self, command_executor, desired_capabilities, session_id=""): self.r_session_id = session_id Remote.__init__(self, command_executor=command_executor, desired_capabilities=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 # 根据标题获取驱动中的sessionid def get_session_id(title): global driver_url session_id = "" d_respon = urllib.request.urlopen(driver_url + "/sessions") result = d_respon.read().decode('utf-8') session_arraay = json.loads(str(result)) # print(sessionArraay) for array in session_arraay["value"]: try: respon = urllib.request.urlopen(driver_url + "/session/" + array["id"] + "/title", timeout=0.1) except: continue result = respon.read().decode('utf-8') rejson = json.loads(result) # print(result) if rejson["value"] == title: session_id = array["id"] break # print(rejson["status"]) # print(array["id"]) return session_id def start_chrome(c_url, user, pwd): global driver chrome_options = webdriver.ChromeOptions() # 初始化Webdriver时禁用W3C chrome_options.add_experimental_option('w3c', False) # 关闭浏览器提示信息 # chrome_options.add_argument('disable-infobars') # 加载自己的chrome浏览器配置 chrome_options.add_argument("--start-maximized") chrome_options.add_argument(f'--user-data-dir=C:/Users/{getpass.getuser()}/AppData/Local/Google/Chrome/User Data') # capabilities = DesiredCapabilities.CHROME driver = webdriver.Chrome(executable_path=dirver_path, port=9515, chrome_options=chrome_options) time.sleep(1) driver.get(c_url) time.sleep(2) driver.find_element_by_id("username").send_keys(user) driver.find_element_by_id("password").send_keys(pwd) # time.sleep(10) driver.find_element_by_class_name("submit-button").click() # driver.find_element_by_xpath("//a[@class='submit-button']").click() # 已经有驱动存在,通过窗口标题查找 def driver_init_by_title(otc_title, otc_url=""): global driver try: sessionid = get_session_id(otc_title) # print("session=" + sessionid) capabilities = DesiredCapabilities.CHROME if sessionid == "": driver = webdriver.Remote(command_executor=driver_url, desired_capabilities=capabilities) start_chrome(otc_url) else: driver = ReuseChrome_Class(command_executor=driver_url, desired_capabilities={}, session_id=sessionid) driver.session_id = sessionid driver.switch_to.parent_frame() driver.switch_to.parent_frame() except Exception as e: print("error:" + str(e.__traceback__.tb_lineno)) print(e) exit() if __name__ == '__main__': title = "" driver_init_by_title(title)