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

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()

问题原因分析

  1. 变量名不一致:定义字典时用的是iestado_civil_dict,调用时却用estado_civil_dict;定义变量时用iestado_civil,调用时用estado_civil,变量名多了前缀i,会直接导致NameError,后续测试行的执行也会受影响。
  2. 动态元素ID依赖:谷歌表单的元素ID(如i21、mG61Hd下的子元素ID)是动态生成的,刷新页面或表单更新后会失效,固定XPATH定位不可靠。
  3. 未等待元素可交互:点击下拉框后,选项可能未完全加载就执行点击操作,导致元素不可交互。
  4. 下拉框与单选框的差异: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:15:10