Selenium填写谷歌表单时Estado civil模块出现ElementNotInteractableException错误
谷歌表单Selenium填写时ElementNotInteractableException问题排查
问题场景
使用Selenium自动填写谷歌表单时,Estado civil(婚姻状态)下拉选择模块执行报错,错误信息如下:
ElementNotInteractableException: element not interactable (Session info: chrome=109.0.5414.75)
对应的代码逻辑是先点击选择框,再通过字典选择选项,和之前的sexo(性别)单选模块逻辑一致,但无法正常执行。
原代码
from selenium import webdriver driver=webdriver.Chrome('driverchrome//chromedriver.exe') #Open the form driver.get('https://forms.gle/A3qCjSCXi5H64qA26') #Add nombre driver.find_element('xpath', '//*[@id="mG61Hd"]/div[2]/div/div[2]/div[1]/div/div/div[2]/div/div[1]/div/div[1]/input').send_keys('hernan') #Add apellido driver.find_element('xpath','//*[@id="mG61Hd"]/div[2]/div/div[2]/div[2]/div/div/div[2]/div/div[1]/div/div[1]/input').send_keys('caceres') #Add nacionaldad driver.find_element('xpath','//*[@id="mG61Hd"]/div[2]/div/div[2]/div[3]/div/div/div[2]/div/div[1]/div/div[1]/input').send_keys('canada') #Add rubro driver.find_element('xpath','//*[@id="mG61Hd"]/div[2]/div/div[2]/div[4]/div/div/div[2]/div/div[1]/div/div[1]/input').send_keys('pesca') #for alternatives: sexo_dict={'hombre': '//*[@id="i21"]/div[3]/div', 'Mujer': '//*[@id="i24"]/div[3]/div', 'Prefiero no decirlo': '//*[@id="i27"]/div[3]/div'} sexo='hombre' driver.find_element('xpath', sexo_dict[sexo]).click() #Choice in Estado civil driver.find_element('xpath','//*[@id="mG61Hd"]/div[2]/div/div[2]/div[6]/div/div/div[2]/div/div[1]/div[1]/div[1]').click() iestado_civil_dict={'soltero':'//*[@id="mG61Hd"]/div[2]/div/div[2]/div[6]/div/div/div[2]/div/div[1]/div[1]/div[3]', 'casado':'//*[@id="mG61Hd"]/div[2]/div/div[2]/div[6]/div/div/div[2]/div/div[1]/div[1]/div[4]', 'divorciado':'//*[@id="mG61Hd"]/div[2]/div/div[2]/div[6]/div/div/div[2]/div/div[1]/div[1]/div[5]', 'prefiero no decirlo':'//*[@id="mG61Hd"]/div[2]/div/div[2]/div[6]/div/div/div[2]/div/div[1]/div[1]/div[6]', } iestado_civil='casado' driver.find_element('xpath', estado_civil_dict[estado_civil]).click() # test line driver.find_element('xpath', '//*[@id="mG61Hd"]/div[2]/div/div[2]/div[6]/div/div/div[2]/div/div[1]/div[1]/div[3]').click()
问题原因分析
- 变量名不一致:定义字典时用的是
iestado_civil_dict,调用时却用estado_civil_dict;定义变量时用iestado_civil,调用时用estado_civil,变量名多了前缀i,会直接导致NameError,后续测试行的执行也会受影响。 - 动态元素ID依赖:谷歌表单的元素ID(如
i21、mG61Hd下的子元素ID)是动态生成的,刷新页面或表单更新后会失效,固定XPATH定位不可靠。 - 未等待元素可交互:点击下拉框后,选项可能未完全加载就执行点击操作,导致元素不可交互。
- 下拉框与单选框的差异:
Estado civil是下拉选择组件,和sexo的单选按钮组件结构不同,直接定位选项的XPATH可能在下拉框未展开时不可见。
解决方案
1. 修复变量名错误
确保字典和变量名一致:
estado_civil_dict={'soltero':'//*[@id="mG61Hd"]/div[2]/div/div[2]/div[6]/div/div/div[2]/div/div[1]/div[1]/div[3]', 'casado':'//*[@id="mG61Hd"]/div[2]/div/div[2]/div[6]/div/div/div[2]/div/div[1]/div[1]/div[4]', 'divorciado':'//*[@id="mG61Hd"]/div[2]/div/div[2]/div[6]/div/div/div[2]/div/div[1]/div[1]/div[5]', 'prefiero no decirlo':'//*[@id="mG61Hd"]/div[2]/div/div[2]/div[6]/div/div/div[2]/div/div[1]/div[1]/div[6]', } estado_civil='casado' driver.find_element('xpath', estado_civil_dict[estado_civil]).click()
2. 使用显式等待确保元素可交互
引入WebDriverWait和expected_conditions,等待元素加载完成并可交互后再操作:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 点击Estado civil下拉框 dropdown = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//*[@id="mG61Hd"]/div[2]/div/div[2]/div[6]/div/div/div[2]/div/div[1]/div[1]/div[1]')) ) dropdown.click() # 等待选项可点击后选择 option = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, estado_civil_dict[estado_civil])) ) option.click()
3. 改用稳定的定位方式
避免依赖动态ID,通过元素文本或相对路径定位,比如定位下拉选项时用文本匹配:
# 选择Estado civil选项的通用方法 def select_estado_civil(option_text): # 点击下拉框 dropdown = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'div[aria-label="Estado civil"] div[role="combobox"]')) ) dropdown.click() # 通过文本定位选项 option = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, f'//div[@role="option" and text()="{option_text}"]')) ) option.click() # 调用方法选择casado select_estado_civil('casado')
4. 移除冗余测试行
测试行重复点击同一个选项,且在正常选择逻辑之后执行,此时下拉框可能已关闭,元素不可见,导致报错,建议移除该测试行。
内容的提问来源于stack exchange,提问作者Strovic
相关产品推荐
相关产品推荐

