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

已导入相关模块,为何这段Selenium自动化表单填充代码无法运行?

Google表单自动填充Selenium代码排查与修复

先贴出你提供的原代码:

from selenium.webdriver.support import expected_conditions as EC
import time

# 1. Setup Service and Driver
service = Service('C:/Users/HP/Desktop/Drivers/chromedriver_win32/chromedriver.exe')
driver = webdriver.Chrome(service=service)

# 2. Define Data
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'],
]
try:
    for data in datas:
        driver.get('https://forms.gle/28PLHQyMXKAxsENx6')
        
        # 3. Wait for elements using Explicit Wait
        wait = WebDriverWait(driver, 10)
        textboxes = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "quantumWizTextinputPaperinputInput")))
        textareaboxes = driver.find_elements(By.CLASS_NAME, "quantumWizTextinputPapertextareaInput")
        
        # 4. Fill Inputs
        count = 0
        for box in textboxes:
            box.send_keys(data[count])
            count += 1
            
        for area in textareaboxes:
            area.send_keys(data[count])
            count += 1
            
        # 5. Submit
        submit = driver.find_element(By.XPATH, '//*[@id="mG61Hd"]/div[2]/div/div[3]/div[1]/div/div/span/span')
        submit.click()
        
        # Give a brief moment for submission to process
        time.sleep(2) 

以下是代码无法正常运行的常见问题及修复方案:

  • 缺失核心导入模块:代码里用到了Service、webdriver、WebDriverWait、By,但仅导入了EC和time,必须补充导入:

    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    
  • 元素定位方式不稳定:Google表单的类名(如quantumWizTextinputPaperinputInput)属于动态生成类名,随时可能变更,建议改用更稳定的定位逻辑:

    • 文本框:通过标签+类型属性定位
    • 文本域:通过标签直接定位
      示例:
    # 等待所有输入框加载完成(匹配文本、邮箱、电话类型)
    textboxes = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'input[type="text"], input[type="email"], input[type="tel"]')))
    # 定位文本域
    textareaboxes = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'textarea')))
    
  • 提交按钮绝对XPATH易失效:原代码用的绝对XPATH依赖页面结构,一旦Google表单调整布局就会失效,换成相对定位:

    # 按按钮角色和标签定位提交按钮
    submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'div[role="button"] span')))
    
  • 索引越界风险:如果textboxes+textareaboxes的数量和data列表长度不匹配,会触发IndexError,建议添加长度校验:

    total_fields = len(textboxes) + len(textareaboxes)
    if total_fields != len(data):
        print(f"跳过当前数据:数据长度{len(data)}与字段数量{total_fields}不匹配")
        continue
    
  • 缺少异常处理与资源清理:原代码只有try块,没有捕获异常和关闭浏览器的逻辑,容易导致进程残留,补充完整:

    except Exception as e:
        print(f"运行出错:{str(e)}")
    finally:
        # 无论成功失败都关闭浏览器
        driver.quit()
    

修复后的完整代码:

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

# 1. Setup Service and Driver
service = Service('C:/Users/HP/Desktop/Drivers/chromedriver_win32/chromedriver.exe')
driver = webdriver.Chrome(service=service)

# 2. Define Data
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'],
]

try:
    for data in datas:
        driver.get('https://forms.gle/28PLHQyMXKAxsENx6')
        
        # 3. Wait for elements using Explicit Wait
        wait = WebDriverWait(driver, 10)
        # 定位所有输入框(文本、邮箱、电话)
        textboxes = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'input[type="text"], input[type="email"], input[type="tel"]')))
        # 定位文本域
        textareaboxes = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'textarea')))
        
        # 校验数据与字段数量匹配
        total_fields = len(textboxes) + len(textareaboxes)
        if total_fields != len(data):
            print(f"跳过当前数据:数据长度{len(data)}与字段数量{total_fields}不匹配")
            continue
        
        # 4. Fill Inputs
        count = 0
        for box in textboxes:
            # 清空输入框再填写(避免残留内容)
            box.clear()
            box.send_keys(data[count])
            count += 1
            
        for area in textareaboxes:
            area.clear()
            area.send_keys(data[count])
            count += 1
            
        # 5. Submit
        submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'div[role="button"] span')))
        submit.click()
        
        # 等待提交完成
        time.sleep(2) 
        
except Exception as e:
    print(f"运行异常:{str(e)}")
finally:
    driver.quit()

内容的提问来源于stack exchange,提问作者Okeke Chidindu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 20:07:27