92 lines
3.7 KiB
Python
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("连接浏览器失败。")
|