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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:53:17