Python Selenium用Service初始化驱动后测试自动关闭如何解决
问题描述
- 原脚本直接指定chromedriver.exe路径初始化驱动时,可正常运行至触发Listings下拉菜单步骤;该写法触发弃用警告后,改为通过Service对象结合webdriver_manager的ChromeDriverManager方式初始化ChromeDriver
- 修改初始化逻辑后运行测试,脚本直接自动关闭,无法执行后续点击「My Listings」的操作;已确认WebDriver Manager拉取的是匹配本机Chrome 102.0.5005版本的对应chromedriver,驱动缓存路径识别正常,问题仍存在
- 需确认当前代码写法是否存在错误,获取问题的正确解决方式
原测试代码
import os from selenium.webdriver.chrome.service import Service from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.maximize_window() driver.get("https://christiesre.crm.gabriels.net/") driver.implicitly_wait(30) listings_dropdown = driver.find_element(by=By.LINK_TEXT, value = "Listings") listings_dropdown.click() my_listings = driver.find_element(by=By.LINK_TEXT, value = "My Listings") my_listings.click()
运行时WebDriver Manager日志
[WDM] - ====== WebDriver manager ====== [WDM] - Current google-chrome version is 102.0.5005 [WDM] - Get LATEST chromedriver version for 102.0.5005 google-chrome [WDM] - Driver [C:\Users\cehu\.wdm\drivers\chromedriver\win32\102.0.5005.61\chromedriver.exe] found in cache
问题原因与修复方案
驱动初始化写法本身没有语法错误,浏览器自动关闭、后续操作无法执行的核心原因有两个:
- Selenium 4版本的资源回收逻辑更严谨,脚本执行完所有代码、或中途抛出未捕获的异常时,Python进程退出会自动调用
driver.quit()关闭浏览器;旧版本Selenium存在资源回收延迟,所以之前没出现过自动关闭的现象,不代表旧逻辑更合理。 - 代码中虽然导入了显式等待相关的依赖,但实际没有使用:全局隐式等待和动态下拉菜单的加载逻辑适配性差,点击Listings下拉后,「My Listings」选项需要短暂时间才会渲染为可点击状态,直接定位元素会触发
ElementNotInteractableException或NoSuchElementException,未捕获的异常会直接终止脚本,触发浏览器自动关闭。
具体修复操作如下:
- 新增Chrome启动项
detach,配置为True后,脚本执行完毕不会自动关闭浏览器 - 删除全局的
implicitly_wait(30)配置,避免隐式等待和显式等待混用导致的等待时长混乱问题 - 点击Listings下拉后,用显式等待等「My Listings」元素变为可点击状态后,再执行点击操作
修复后的可运行代码:
from selenium.webdriver.chrome.service import Service from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC # 配置启动选项,执行完不自动关闭浏览器 options = webdriver.ChromeOptions() options.add_experimental_option("detach", True) driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) driver.maximize_window() driver.get("https://christiesre.crm.gabriels.net/") listings_dropdown = WebDriverWait(driver, 30).until( EC.element_to_be_clickable((By.LINK_TEXT, "Listings")) ) listings_dropdown.click() # 等待下拉选项加载完成可点击后再操作 my_listings = WebDriverWait(driver, 30).until( EC.element_to_be_clickable((By.LINK_TEXT, "My Listings")) ) my_listings.click()
内容的提问来源于stack exchange,提问作者cehuu
相关产品推荐
相关产品推荐

