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