zhiyun-autoweb/browser_manager.py

92 lines
3.7 KiB
Python

# 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("连接浏览器失败。")