# browser_manager.py import subprocess import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from config import CHROME_DEBUGGER_PORT, USER_DATA_DIR def get_chrome_driver(use_debugger=False, url=None): """ 获取 Chrome WebDriver 实例。 :param use_debugger: 是否使用 debugger 模式连接到现有浏览器。 :param url: 初始加载的 URL。 :return: WebDriver 实例。 """ chrome_options = Options() if use_debugger: # 连接到已经启动的 Chrome 浏览器 debugger_address = f"127.0.0.1:{CHROME_DEBUGGER_PORT}" chrome_options.add_experimental_option("debuggerAddress", debugger_address) print(f"连接到现有的 Chrome 实例: {debugger_address}") else: # 启动一个新的 Chrome 浏览器 # 为了后续可以复用,也指定 user-data-dir chrome_options.add_argument(f"--user-data-dir={USER_DATA_DIR}") chrome_options.add_argument("--start-maximized") chrome_options.add_argument("--disable-infobars") chrome_options.add_argument("--disable-extensions") chrome_options.add_argument("--disable-popup-blocking") print("启动一个新的 Chrome 实例。") try: service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service, options=chrome_options) if url and not use_debugger: driver.get(url) return driver except Exception as e: print(f"启动浏览器时出错: {e}") if not use_debugger: print("尝试以调试模式启动一个新的 Chrome 实例...") # 如果正常启动失败,可以尝试手动启动一个调试模式的浏览器 start_chrome_in_debug_mode() time.sleep(5) # 等待浏览器启动 return get_chrome_driver(use_debugger=True) return None def start_chrome_in_debug_mode(): """ 在后台启动一个带有远程调试端口的 Chrome 浏览器。 """ try: command = ( f'start chrome.exe --remote-debugging-port={CHROME_DEBUGGER_PORT} ' f'--user-data-dir="{USER_DATA_DIR}"' ) subprocess.Popen(command, shell=True) print(f"已启动 Chrome 调试模式,端口: {CHROME_DEBUGGER_PORT}") except FileNotFoundError: print("错误: 'chrome.exe' 未找到。请确保 Chrome 已安装并已添加到系统路径中。") except Exception as e: print(f"启动调试模式的 Chrome 时出错: {e}") if __name__ == '__main__': # 这是一个简单的使用示例 # 示例1: 启动一个新的浏览器并访问百度 # print("--- 示例1: 启动新浏览器 ---") # driver1 = get_chrome_driver(url="https://www.baidu.com") # if driver1: # time.sleep(5) # print("页面标题:", driver1.title) # driver1.quit() # 示例2: 首先手动启动一个调试模式的浏览器,然后连接它 print("\n--- 示例2: 连接到调试模式的浏览器 ---") print(f"请先手动执行以下命令启动Chrome: \nchrome.exe --remote-debugging-port={CHROME_DEBUGGER_PORT} --user-data-dir=\"{USER_DATA_DIR}\"") input("按 Enter 键继续...") driver2 = get_chrome_driver(use_debugger=True) if driver2: print("成功连接到浏览器!") print("当前页面标题:", driver2.title) # 注意:通过 debugger 连接时,不要用 quit() 关闭浏览器,否则会关闭整个浏览器 # driver2.close() # close() 只会关闭当前标签页 else: print("连接浏览器失败。")