Selenium循环调用driver.get(url)无报错无日志却偶尔失效如何解决
Selenium循环调用driver.get无报错失效问题排查
该问题不是Selenium的driver.get方法本身的Bug,主要由配置、运行环境、业务侧拦截三类因素导致,具体原因和修复方案如下:
核心原因
- 日志被主动禁用:你代码中添加了
options.add_experimental_option("excludeSwitches", ["enable-logging"])配置,直接关闭了ChromeDriver的运行日志输出,就算驱动层面出现请求错误、进程异常也不会有任何日志提示。 - 无超时设置导致请求挂死:Selenium默认未开启页面加载超时限制,当遇到网络波动、目标站点响应缓慢、静态资源加载卡住时,
driver.get会一直处于等待状态,不会往下执行后续代码也不会抛出异常,表现出来就是方法失效。 - 反爬拦截导致加载结果不符合预期:高频循环访问公共站点(尤其是谷歌服务)会触发站点的频次控制规则,返回429状态码、验证码页面或者直接断开连接,
driver.get只要收到HTTP响应就会判定执行完成,不会自动校验返回内容是否符合预期,很容易被误认为是方法失效。 - 长时运行的进程资源泄露:上千次循环的长时运行场景下,Chrome浏览器和Chromedriver进程会出现内存溢出、句柄泄露的问题,导致后续驱动命令无响应。
修复方案
- 移除禁用日志的配置行,开启ChromeDriver日志输出,方便定位底层报错原因。
- 初始化driver后添加超时配置,调用
driver.get时套异常捕获逻辑,超时后自动重试:
from selenium import webdriver import time options = webdriver.ChromeOptions() options.add_argument('--ignore-certificate-errors') options.add_argument("--disable-webgl") path = r'chromedriver.exe' driver = webdriver.Chrome(path,options=options) # 新增超时设置 driver.set_page_load_timeout(30) driver.set_script_timeout(30) driver.implicitly_wait(10) for x in range(1000): try: url = "https://www.palabrasaleatorias.com/random-words.php" driver.get(url) # 简单校验加载结果 assert "palabrasaleatorias" in driver.current_url # 增加请求间隔 time.sleep(1) url = "https://www.google.ru/imghp?hl=ru" print(x,"Test[1]") driver.get(url) assert "google.ru" in driver.current_url print(x,"Test[2]") time.sleep(1) except Exception as e: print(f"第{x}次请求出错:{str(e)}") # 出错后刷新重试 driver.refresh() # 每300次循环可以加一个重启driver的逻辑,释放资源 driver.close()
- 每运行200-300次循环就主动关闭当前driver,重启新的driver进程,避免资源累积溢出。
内容的提问来源于stack exchange,提问作者Ruslan Shamsiev
相关产品推荐
相关产品推荐

