PAYATHON 2026

为什么 Python Selenium 代码在导入模块后仍无法正常运行?

排障赵师傅

代码里有几处问题会直接导致程序无法运行:缺少必要的导入、缩进错误,以及 try 语句缺少对应的 except 或 finally。如果源码中还包含 \#、\[ 这样的反斜杠,也需要清理。

修复后,还要检查元素定位、数据与字段的对应顺序,并确认提交是否完成。目前没有完整的报错信息,无法判断程序最先卡在哪一步。

先修复语法和导入

补全使用到的名称

原代码只导入了 EC 和 time,还用到了 Service、webdriver、WebDriverWait 和 By。如果其他位置也没有导入这些名称,执行到相关语句时就会出现 NameError。

补充以下导入:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

import 只引入指定的名称,导入 expected_conditions 不会让其他 Selenium 类同时在当前文件中可用。

恢复缩进,补全 try 结构

Python 用缩进划分代码块。for data in datas: 应放在 try 内,打开页面、填写和提交的操作则应放在循环内。

try 后必须有 except 或 finally。这里可以用 finally 关闭浏览器:

try:
    for data in datas:
        driver.get("https://forms.gle/28PLHQyMXKAxsENx6")
        # 填写和提交操作
finally:
    driver.quit()

即使填写时发生异常,程序也会尝试结束浏览器会话。异常仍会向外抛出,便于查看完整的 traceback。

检查反斜杠是否真的存在于源码中

问题里的代码包含这些写法:

\# 注释
datas = \[
data\[count\]

如果反斜杠只是发布问题时产生的 Markdown 转义,实际 .py 文件中没有,就不用处理。如果已经复制进源码,应改为:

# 注释
datas = [
    ["example"]
]
value = data[count]

不要批量删除文件中的所有反斜杠,字符串里的路径或转义序列可能需要保留。

再检查表单填写逻辑

原代码先收集所有单行输入框,再收集所有多行文本框,然后依次取出 data 中的数据填入。这要求数据也按“所有单行字段在前,所有多行字段在后”的顺序排列。

假设表单顺序是姓名、邮箱、地址(多行)、电话,原来的写法就可能把地址填进电话框。字段数量超过数据数量时,会出现 IndexError;字段数量少于数据数量时,则可能遗漏数据。

还需要检查以下几处:

  • presence_of_all_elements_located 只等待至少找到一个匹配元素,不保证预期的所有字段都已加载,也不保证元素可见、可输入。
  • 后面的 find_elements 不会因为前面做过显式等待,就自动等待多行文本框。
  • 原来的提交 XPath 依赖多层 div 的位置,页面结构变化后容易失效。
  • time.sleep(2) 只会暂停执行,不能确认提交成功。提交失败或网络较慢时,下一次 driver.get() 可能过早离开当前页面。

修正后的代码示例

示例仍手动指定 ChromeDriver 路径,并将单行和多行文本框放在一起,按 DOM 顺序查找。

使用这段代码的前提是:表单在同一页展示全部五个文本字段,数据顺序与字段的 DOM 顺序一致,页面也仍在使用原代码中的类名。提交按钮的定位和成功提示需要按实际页面核对,这段代码本身不能保证它们有效。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


FORM_URL = "https://forms.gle/28PLHQyMXKAxsENx6"

FIELDS = (
    By.CSS_SELECTOR,
    "input.quantumWizTextinputPaperinputInput, "
    "textarea.quantumWizTextinputPapertextareaInput",
)

# 假设提交按钮使用 role="button",且按钮文字为以下两者之一。
SUBMIT = (
    By.XPATH,
    "//*[@role='button']"
    "[normalize-space()='提交' or normalize-space()='Submit']",
)

# 这是英文成功提示示例,必须替换为实际页面中的确认文字。
SUCCESS = (
    By.XPATH,
    "//*[normalize-space()='Your response has been recorded.']",
)

datas = [
    [
        "Mary D Joiner",
        "MaryDJoiner@gmail.com",
        "4079025063",
        "2474 McDonald Avenue, Maitland",
        "NA",
    ],
    [
        "Karen B Johnson",
        "KarenBJohnson@gmail.com",
        "3153437575",
        "2143 Oak Street, GRAND ISLE",
        "NA",
    ],
]


def ready_fields(driver, expected_count):
    fields = driver.find_elements(*FIELDS)

    if len(fields) != expected_count:
        return False

    if not all(field.is_displayed() and field.is_enabled()
               for field in fields):
        return False

    return fields


service = Service(
    "C:/Users/HP/Desktop/Drivers/chromedriver_win32/chromedriver.exe"
)
driver = webdriver.Chrome(service=service)

try:
    wait = WebDriverWait(driver, 10)

    for data in datas:
        driver.get(FORM_URL)

        fields = wait.until(
            lambda current_driver: ready_fields(
                current_driver, len(data)
            )
        )

        for field, value in zip(fields, data):
            field.clear()
            field.send_keys(value)

        wait.until(EC.element_to_be_clickable(SUBMIT)).click()

        # 确认本条提交完成后,再处理下一条。
        wait.until(EC.visibility_of_element_located(SUCCESS))
finally:
    driver.quit()

CSS 选择器用逗号合并两类字段后,可以按 DOM 顺序返回匹配元素。这种写法仍依赖页面结构和数据顺序。如果表单经常调整,建议检查每个问题的容器,为姓名、邮箱等字段分别建立定位与数据的对应关系。

如何根据报错继续排查

先看完整 traceback 最后一行的异常类型,再看它指向的代码。

异常或现象优先检查
SyntaxError、IndentationError多余转义字符、缩进、未闭合括号、缺少 except 或 finally
NameError是否导入了报错中提到的名称
ModuleNotFoundError: No module named 'selenium'当前运行脚本的 Python 环境是否安装了 Selenium
NoSuchDriverException、SessionNotCreatedException驱动文件路径、文件是否存在,以及 Chrome 与 ChromeDriver 是否兼容
TimeoutException字段数量、选择器、页面是否加载成功,以及成功提示是否与配置一致
NoSuchElementException定位表达式是否匹配当前页面
ElementNotInteractableException元素是否隐藏、禁用,或定位到了不可输入的节点
IndexError原代码匹配到的字段数量是否超过当前数据条目的长度

如果确实没有安装 Selenium,可以在运行脚本所用的 Python 环境中执行:

python -m pip install selenium

还要确认表单是否有分页、必填选项、登录要求或重复提交限制。有这些条件时,仅填写文本框并点击提交可能无法完成流程。调试时先用一条数据确认字段对应正确,在浏览器中核对提交结果后,再运行整个循环。

备注:内容仅供参考。