You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:18:14