Selenium TimeoutException未捕获连接超时错误致脚本崩溃问题
问题原因
异常捕获失效的核心原因是捕获的异常类型不匹配:
从报错栈可以明确看到,目标IP不可达、连接超时时,Selenium抛出的是selenium.common.exceptions.WebDriverException(底层是Chrome内核返回的net::ERR_CONNECTION_TIMED_OUT网络层错误),并不是代码里写的TimeoutException。TimeoutException只会在Selenium显式等待、手动设置的页面加载超时阈值触发时抛出,网络直连失败、连接拒绝、DNS解析失败这类底层网络错误都不属于这个异常类,自然无法被捕获,直接导致脚本崩溃退出。
除此之外原代码还存在三个逻辑漏洞:
- 异常分支执行完
driver.close()后没有中断流程,代码会继续往下执行查找登录元素、校验登录状态的逻辑,触发二次报错 - 每个异常分支单独写
driver.close()很容易漏写,造成Chrome僵尸进程残留 - 没有手动设置页面加载超时,默认加载等待时间过长,批量测试IP时效率极低
修复后代码
#!/usr/bin/env python3 from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC # 补导入WebDriverException,用于捕获网络层连接错误 from selenium.common.exceptions import TimeoutException, NoSuchElementException, WebDriverException username = "8000" password = "0" def default_password(site_ip): ops = webdriver.ChromeOptions() ops.add_argument('--ignore-certificate-errors') ops.add_argument('--ignore-ssl-errors') ops.add_argument('--headless') # 补充无界面模式运行必要参数,避免WSL/ Linux环境启动失败 ops.add_argument('--no-sandbox') ops.add_argument('--disable-gpu') ops.add_argument('--disable-dev-shm-usage') driver = None try: driver = webdriver.Chrome('/mnt/c/Windows/chromedriver.exe', options=ops) # 显式设置10秒页面加载超时,避免无意义长时间等待 driver.set_page_load_timeout(10) driver.get("https://"+site_ip) except (TimeoutException, WebDriverException): # 场景1:目标IP/网页无法连通访问 print(f"[!] 目标{site_ip}无法连通访问") return try: driver.find_element(By.ID, "username").send_keys(username) driver.find_element(By.ID, "password").send_keys(password) driver.find_element(By.ID, "submit").click() except NoSuchElementException: # 场景2:目标站点不存在登录页面 print(f"[!] 目标{site_ip}未找到匹配的登录页面,建议手动访问确认") return try: # 等待登录成功标识元素加载 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "loggedInUsername"))) # 场景4:账号密码校验通过,登录成功 print(f"[+] 目标{site_ip}默认账号密码校验通过,登录成功") except TimeoutException: # 场景3:输入的用户名/密码校验失败 print(f"[-] 目标{site_ip}默认账号密码校验失败,登录未成功") finally: # 统一在finally块退出浏览器,彻底清理进程避免残留 if driver: driver.quit() if __name__ == "__main__": # 单IP测试,批量场景直接循环IP列表调用函数即可 default_password("192.168.0.1")
修复点说明
- 补全异常捕获范围:页面访问阶段同时捕获
TimeoutException(页面加载超时)和WebDriverException(网络连接拒绝、连接超时、DNS解析失败等所有网络层错误),完整覆盖目标不可达的场景 - 每个异常分支处理完后直接
return中断流程,不会执行后续无效的登录、校验逻辑 - 把浏览器关闭逻辑统一放到
finally块,用driver.quit()替代driver.close(),保证无论流程走哪个分支都能彻底退出Chrome进程,不会残留僵尸进程 - 显式设置10秒页面加载超时、10秒登录结果等待超时,大幅提升批量IP测试的运行效率
- 输出信息完全对齐设计的4种测试场景,结果标识清晰可辨
内容的提问来源于stack exchange,提问作者microserf
相关产品推荐
相关产品推荐

