使用Selenium点击Visa汇率计算器按钮遇ElementNotInteractableException求解
解决Visa汇率计算器点击按钮时的ElementNotInteractableException问题
你的代码存在几处问题,以下是针对性的解决方法:
1. 修正变量赋值错误
你在获取银行手续费输入框时错误地重复赋值给了to_dropdown,这会覆盖之前的目标货币下拉框引用,可能引发页面交互异常。将这行代码:
bank_rate = to_dropdown = shadow_root.find_element(By.ID, "input_bank_rate")
修改为:
bank_rate = shadow_root.find_element(By.ID, "input_bank_rate")
2. 用显式等待替代sleep,确保元素可交互
直接使用sleep可靠性差,改用WebDriverWait等待元素进入可操作状态后再执行交互:
# 等待银行手续费输入框可交互 bank_rate = wait.until(EC.element_to_be_clickable((By.ID, "input_bank_rate")), root=shadow_root) bank_rate.send_keys(Keys.CONTROL, 'a') bank_rate.send_keys(Keys.BACKSPACE) bank_rate.send_keys('0')
注:Selenium 4+支持在显式等待中通过root参数指定shadow root,无需重复调用shadow_root.find_element。
3. 等待计算按钮可点击后再触发点击
点击按钮前必须确保它处于可交互状态,否则会抛出ElementNotInteractableException:
# 等待Calculate Conversion按钮可点击并执行点击 calculate_btn = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'vs-btn.vs-btn-primary')), root=shadow_root) calculate_btn.click()
完整修改后的代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.get('https://usa.visa.com/support/consumer/travel-support/exchange-rate-calculator.html') wait = WebDriverWait(driver, 30) # 接受Cookie协议 accept_button_element = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[text()='Accept']"))) accept_button_element.click() # 获取组件的shadow root shadow_root = driver.find_element(By.XPATH, "//dm-calculator").shadow_root # 填充消费金额 enter_amount = wait.until(EC.element_to_be_clickable((By.ID, "input_amount_paid")), root=shadow_root) enter_amount.send_keys("1") # 选择源货币 from_dropdown = wait.until(EC.element_to_be_clickable((By.ID, "autosuggestinput_from")), root=shadow_root) from_dropdown.click() wait.until(EC.element_to_be_clickable((By.ID, "listbox-item-157")), root=shadow_root).click() # 选择目标货币 to_dropdown = wait.until(EC.element_to_be_clickable((By.ID, "autosuggestinput_to")), root=shadow_root) to_dropdown.click() wait.until(EC.element_to_be_clickable((By.ID, "listbox-item-0")), root=shadow_root).click() # 打开银行手续费编辑面板 fee_edit = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'vs-link-cta.vs-calculator-edit-link')), root=shadow_root) fee_edit.click() # 填充银行手续费 bank_rate = wait.until(EC.element_to_be_clickable((By.ID, "input_bank_rate")), root=shadow_root) bank_rate.send_keys(Keys.CONTROL, 'a') bank_rate.send_keys(Keys.BACKSPACE) bank_rate.send_keys('0') # 触发计算按钮 calculate_btn = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'vs-btn.vs-btn-primary')), root=shadow_root) calculate_btn.click()
额外处理方案
如果上述方法仍遇到输入框不可交互的问题,可尝试用JavaScript直接设置输入框值,绕开元素交互状态限制:
driver.execute_script("arguments[0].value = '0';", bank_rate)
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

