已导入相关模块,为何这段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
相关产品推荐
相关产品推荐

