Selenium点击按钮报错‘element not interactable’的解决求助
Selenium点击按钮报错:
element not interactable 解决方案 问题描述
使用Selenium点击按钮时,持续返回错误:
Message: element not interactable: [object HTMLButtonElement] has no size and location
已尝试最大化窗口、显式等待等方法,但程序等待超时后直接退出。
对应HTML代码
<div class="actions-toolbar"> ::before <div class="primary"> <button class="action primary checkout" type="submit" data-bind=" click: placeOrder, attr: {title: $t('Place Order')}, css: {disabled: !isPlaceOrderActionAllowed()}, enable: (getCode() == isChecked()) " title="Go to payment"> <span data-bind="i18n: 'Place Order'">Go to payment</span> </button> </div> ::after </div>
我的Python代码
download_button_path = "//div[@class='actions-toolbar']/div[@class='primary']/button[1]" button_to_click = driver.find_element(By.XPATH, download_button_path) hover = ActionChains(driver).move_to_element(button_to_click) hover.perform() button_to_click.click()
可行解决方法
1. 先确认按钮是否处于可用状态
从HTML的data-bind属性可以看到,按钮的启用依赖两个条件:
isPlaceOrderActionAllowed()返回true(订单满足下单条件)getCode() == isChecked()(选中了对应的支付/下单选项)
如果按钮实际处于禁用状态,Selenium自然无法点击,先手动在页面验证这些前置条件是否满足。
2. 改用显式等待元素可交互
替换直接定位元素的逻辑,等待元素进入可点击状态:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC download_button_path = "//div[@class='actions-toolbar']/div[@class='primary']/button[1]" button_to_click = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.XPATH, download_button_path)) ) button_to_click.click()
3. 尝试点击按钮内部的span元素
部分页面的按钮可点击区域实际是内部的<span>标签,直接定位该元素点击:
span_path = "//div[@class='actions-toolbar']/div[@class='primary']/button/span[text()='Go to payment']" WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, span_path))).click()
4. 用JavaScript强制触发点击
如果以上方法都无效,直接通过JS绕过Selenium的交互检查,强制点击元素:
button_to_click = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, download_button_path))) driver.execute_script("arguments[0].click();", button_to_click)
5. 检查元素是否在iframe/shadow DOM中
如果按钮嵌套在iframe内,需要先切换到对应iframe再定位;如果是shadow DOM结构,要先获取shadow根节点再进行元素定位。
内容的提问来源于stack exchange,提问作者flolivei
相关产品推荐
相关产品推荐

