Selenium启动已登录账号的Chrome后脚本无法正常执行问题
问题描述
我运行一个简单的Selenium脚本,目的是访问指定页面并点击按钮,但设置Chrome以已登录账号启动(使用已登录状态的配置文件)后,脚本似乎失去焦点,无法正常执行。
原代码
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # Set up Chrome options chrome_options = Options() chrome_options.headless = False # Set to True if you don't want to see the browser window chrome_options.add_argument("user-data-dir=/Users/myusername/Library/Application Support/Google/Chrome") #provide location where chrome stores profiles # Initialize the browser chrome_driver_path = '/Users/myusername/Documents/chromedriver_mac64/chromedriver' driver = webdriver.Chrome(executable_path=chrome_driver_path, chrome_options=chrome_options) # Navigate to the URL url = "https://www.somewhere.com" driver.get(url) def getElAfterRendered(el): return WebDriverWait(driver, 10).until(el) def css(selector): return EC.presence_of_element_located((By.CSS_SELECTOR, selector)) def xpath(selector): return EC.presence_of_element_located((By.XPATH, selector)) css_sel_swap_link = getElAfterRendered(css('#subtitle a')) css_sel_swap_link.click()
修复方案
1. 避免Chrome用户目录冲突
直接指向整个Chrome数据目录可能和正在运行的Chrome实例产生冲突,建议指定具体的用户配置文件夹,且启动脚本前关闭所有Chrome进程:
# 示例:使用默认配置文件 chrome_options.add_argument("user-data-dir=/Users/myusername/Library/Application Support/Google/Chrome/Default") # 如果是多配置文件,比如Profile 1: # chrome_options.add_argument("user-data-dir=/Users/myusername/Library/Application Support/Google/Chrome") # chrome_options.add_argument("--profile-directory=Profile 1")
2. 等待元素可点击而非仅存在
原代码仅判断元素存在,但元素可能未加载完成无法点击,替换为等待元素可点击的条件:
def css(selector): return EC.element_to_be_clickable((By.CSS_SELECTOR, selector)) def xpath(selector): return EC.element_to_be_clickable((By.XPATH, selector))
3. 强制获取窗口焦点
添加代码确保脚本控制当前窗口,避免焦点丢失:
driver.get(url) # 切换到当前窗口 driver.switch_to.window(driver.current_window_handle) # 最大化窗口确保元素可见 driver.maximize_window()
4. 匹配ChromeDriver与Chrome版本
确保ChromeDriver版本和本地安装的Chrome版本完全一致,版本不匹配会引发各类异常。
修改后的完整代码
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 配置Chrome选项 chrome_options = Options() chrome_options.headless = False # 指定已登录的用户配置文件(启动前关闭所有Chrome实例) chrome_options.add_argument("user-data-dir=/Users/myusername/Library/Application Support/Google/Chrome/Default") # Selenium 4.6+ 无需手动指定executable_path,会自动管理驱动 driver = webdriver.Chrome(options=chrome_options) # 访问目标页面 url = "https://www.somewhere.com" driver.get(url) # 切换到当前窗口并最大化 driver.switch_to.window(driver.current_window_handle) driver.maximize_window() def getElAfterRendered(el): return WebDriverWait(driver, 15).until(el) def css(selector): return EC.element_to_be_clickable((By.CSS_SELECTOR, selector)) def xpath(selector): return EC.element_to_be_clickable((By.XPATH, selector)) # 等待元素可点击后执行点击 css_sel_swap_link = getElAfterRendered(css('#subtitle a')) css_sel_swap_link.click()
内容的提问来源于stack exchange,提问作者Donovant
相关产品推荐
相关产品推荐

