Selenium Python自动化报错:'list'对象无'tag_name'属性求助
问题解决:AttributeError: 'list' object has no attribute 'tag_name'
错误根源
你代码里的web.find_elements(By.XPATH, "...")返回的是元素列表,但Select构造函数需要传入单个WebElement对象,因此触发了该错误。
修复步骤
1. 替换find_elements为find_element
将下拉框元素定位代码改为获取单个元素:
select_element = web.find_element(By.XPATH,"//*[@id='mG61Hd']/div[2]/div/div[2]/div[3]/div/div/div[2]/div/div[1]/div[1]/div[3]/span")
2. 适配Google Forms下拉框特性
Google Forms的下拉框并非标准HTML <select>标签,直接使用Select类无效,需改用点击展开+选择的方式:
# 点击下拉框展开选项列表 dropdown = web.find_element(By.XPATH,"//*[@id='mG61Hd']/div[2]/div/div[2]/div[3]/div/div/div[2]/div/div[1]/div[1]/div[3]/span") dropdown.click() # 等待选项加载并选择第一个选项(可根据需求调整XPATH定位目标选项) option = WebDriverWait(web, 10).until( EC.element_to_be_clickable((By.XPATH, "//div[@role='option'][1]")) ) option.click()
3. 调整代码逻辑位置
你当前把下拉框处理代码放在了循环外部,会导致仅在所有表单循环结束后才执行下拉框操作,需将其移到内部循环中,与姓名、姓氏填写代码放在同一层级。
4. 优化等待方式(推荐)
用显式等待替代time.sleep,让代码更稳定:
# 等待姓名输入框加载并输入内容 name_input = WebDriverWait(web, 10).until( EC.visibility_of_element_located((By.XPATH, "//*[@id='mG61Hd']/div[2]/div/div[2]/div/div/div/div[2]/div/div[1]/div/div[1]/input")) ) name_input.send_keys(entry['name'])
完整修正后的核心代码片段
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import pandas as pd web = webdriver.Chrome("/home/nosra/chromedriver") df = pd.read_excel('info1.xlsx') url = ["https://docs.google.com/forms/d/e/1FAIpQLScGMoYVsxtsQ0Je4RTYEZndWrKkdt5jJwXBcMAcOia2WuIRtA/viewform?usp=sf_link"] for link in url: for i in df.index : web.get(link) entry = df.loc[i] # 填写姓名 name_input = WebDriverWait(web, 10).until( EC.visibility_of_element_located((By.XPATH, "//*[@id='mG61Hd']/div[2]/div/div[2]/div/div/div/div[2]/div/div[1]/div/div[1]/input")) ) name_input.send_keys(entry['name']) # 填写姓氏 last_name_input = WebDriverWait(web, 10).until( EC.visibility_of_element_located((By.XPATH, "//*[@id='mG61Hd']/div[2]/div/div[2]/div[2]/div/div/div[2]/div/div[1]/div/div[1]/input")) ) last_name_input.send_keys(entry['lastName']) # 处理下拉框 dropdown = WebDriverWait(web, 10).until( EC.element_to_be_clickable((By.XPATH, "//*[@id='mG61Hd']/div[2]/div/div[2]/div[3]/div/div/div[2]/div/div[1]/div[1]/div[3]/span")) ) dropdown.click() # 选择目标选项 option = WebDriverWait(web, 10).until( EC.element_to_be_clickable((By.XPATH, "//div[@role='option'][1]")) ) option.click() # 可选:添加表单提交逻辑 # submit_btn = WebDriverWait(web, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[@role='button' and text()='提交']"))) # submit_btn.click()
内容的提问来源于stack exchange,提问作者Nosra Trabelsi
相关产品推荐
相关产品推荐

