Selenium ChromeDriver无报错但抛堆栈跟踪,程序意外终止求助
问题:Python Selenium自动化程序无提示意外终止
我用Python Selenium实现流程自动化,但程序意外终止且无明确错误提示。代码已用try/except包裹,也设置了元素存在的显式等待,排除了元素未找到的问题。试过全局try/except和增加time.sleep等待页面加载,问题依旧。
代码示例
from selenium import webdriver from selenium.webdriver.common.by import By import random import re from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.select import Select from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.desired_capabilities import DesiredCapabilities import time caps = DesiredCapabilities().CHROME caps["pageLoadStrategy"] = "eager" driver = webdriver.Chrome(desired_capabilities=caps) warningstring = "" pagenum = 1 driver.get("url") WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div/div/div/div/form/input[1]')) ).send_keys("email") WebDriverWait(driver,10).until( EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div/div/div/div/form/input[2]')) ).send_keys("password") WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div/div/div/div/form/button')) ).click() while True: for i in range(1, 25): try: driver.get(WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div/div[5]/div/ul/li[{0}]/div[2]/div[1]/a'.format(i))) ).get_attribute("href")) dabangfloor = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[3]/div[2]/div/div/div/div[1]/div[3]/div/ul/li[2]/div[2]')) ).text.split("/")[1].replace("층","") dabangpark = re.findall(r'\d+', WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[3]/div[2]/div/div/div/div[1]/div[3]/div/ul/li[7]/div[2]')) ).text)[0] dabangpurpose = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[3]/div[2]/div/div/div/div[1]/div[3]/div/ul/li[9]/div[2]/p')) ).text print(i, dabangfloor, dabangpark, dabangpurpose) driver.get("url".format(pagenum)) except Exception as e: print(e) print(warningstring) exit(0) try: pagenum += 1 except Exception as clicke: print(clicke) print("End of the page, done.") print(warningstring) exit(0) k = input("Press Any Key")
程序终止时的控制台输出
Message: Stacktrace: 0 chromedriver 0x0000000102601670 chromedriver + 4298352 1 chromedriver 0x00000001025f9bbc chromedriver + 4266940 2 chromedriver 0x000000010222c758 chromedriver + 280408 3 chromedriver 0x0000000102267b38 chromedriver + 523064 4 chromedriver 0x00000001022a0080 chromedriver + 753792 5 chromedriver 0x000000010225a2d0 chromedriver + 467664 6 chromedriver 0x000000010225b354 chromedriver + 471892 7 chromedriver 0x00000001025c16c4 chromedriver + 4036292 8 chromedriver 0x00000001025c5c64 chromedriver + 4054116 9 chromedriver 0x00000001025cc2d8 chromedriver + 4080344 10 chromedriver 0x00000001025c6970 chromedriver + 4057456 11 chromedriver 0x000000010259d8dc chromedriver + 3889372 12 chromedriver 0x00000001025e525c chromedriver + 4182620 13 chromedriver 0x00000001025e53b4 chromedriver + 4182964 14 chromedriver 0x00000001025f40f4 chromedriver + 4243700 15 libsystem_pthread.dylib 0x000000019898206c _pthread_start + 148 16 libsystem_pthread.dylib 0x000000019897ce2c thread_start + 8
解决方案与排查方向
- 版本匹配问题:这种无具体错误信息的Chromedriver栈追踪,最常见原因是ChromeDriver与Chrome浏览器版本不兼容。检查Chrome版本(设置→关于Chrome),下载对应版本的ChromeDriver替换当前使用的驱动。
- 页面加载策略调整:
eager加载策略可能导致DOM未完全渲染就执行操作,即使有显式等待也可能触发不稳定问题。可以尝试切换为默认的normal加载策略,或者在关键步骤前添加driver.implicitly_wait(2)补充等待。 - 循环内页面跳转的稳定性优化:循环中频繁调用
driver.get()回到列表页后,需重新等待列表容器加载完成再继续循环,避免因页面未就绪导致后续元素定位失败。例如在driver.get("url".format(pagenum))后添加:WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div/div[5]/div/ul'))) - 异常处理逻辑优化:当前except块直接
exit(0)会导致程序立即终止,无法定位具体出错项。建议修改为跳过当前循环项并记录详细错误:except Exception as e: print(f"第{pagenum}页,第{i}项出错: {str(e)}") print(warningstring) continue # 替换exit(0),继续执行后续循环 - 绝对XPATH的脆弱性修复:绝对XPATH依赖页面完整结构,稍有变动就会失效。建议改用相对XPATH,例如登录输入框可改为
//form//input[@type='email'],列表项链接改为//ul[@class='列表容器类名']/li[{0}]/div[2]/div[1]/a(根据实际class调整),提升定位稳定性。 - 资源泄漏处理:长时间循环可能导致浏览器资源占用过高崩溃,可每处理N页后重启浏览器,或定期执行
driver.delete_all_cookies()清理缓存。
内容的提问来源于stack exchange,提问作者justiceserv
相关产品推荐
相关产品推荐

