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

Selenium报错Message element is not interactable,已尝试常见方案仍未解决求其他方案

解决Selenium "Element not interactable" 错误的额外方案

你的测试代码

from selenium import webdriver  
import time
from selenium.webdriver.common.keys import Keys  
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import random
import select

driver = webdriver.Chrome('ChromeDriver')
driver.get("https://devbusiness.tunai.io/login")
time.sleep(2)
driver.maximize_window()

#log in credentials
username = driver.find_element(By.NAME, "loginUsername");
username.send_keys("xxxxx");

password = driver.find_element(By.NAME, "loginPassword");
password.send_keys("xxxxx");

login = driver.find_element(By.XPATH,"//*[@id='app']/div/div/div/div/div/div[2]/form/div[4]/button");
login.submit();
time.sleep(3)

driver.get("https://devbusiness.tunai.io/dashboard/my_salon_user")
time.sleep(3)

randomUsername = random.choice(["dayon.salon3@tunai","dayonmanager@tunai","Dayon.der@tunai"])
driver.find_element(By.XPATH, "//tbody[@role='rowgroup']/tr[@role='row']/td/a[text()='"+ randomUsername +"']").click()
print("Username selected: ", randomUsername)
time.sleep(5)

driver.find_element(By.XPATH,"//*[@id='page-content']/div/div[3]/div/div[2]/div/div/div[2]/div/div[1]/header/a").click()
time.sleep(5)

# Get the list of elements
elements = driver.find_elements(By.CLASS_NAME,'custom-control-input')

# Select a random element from the list
random_element = random.choice(elements)
driver.execute_script("arguments[0].click();", random_element)

# Click on the selected element
random_element.click()
print("Element selected: ", random_element)
time.sleep(5)

driver.find_element(By.XPATH,"//*[@id='accKey']").click()
time.sleep(5)

可行的解决办法

  • 滚动到元素可见区域
    元素可能处于页面视野外导致无法交互,先将元素滚动到可见位置:

    # 方法1:用JS平滑滚动到元素中心
    driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});", random_element)
    # 方法2:用ActionChains移动到元素位置
    from selenium.webdriver.common.action_chains import ActionChains
    actions = ActionChains(driver)
    actions.move_to_element(random_element).perform()
    
  • 检查并切换到iframe
    如果目标元素嵌套在iframe中,必须先切换到对应iframe才能操作:

    wait = WebDriverWait(driver, 10)
    # 替换为实际的iframe定位器
    iframe = wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, "target-iframe-id")))
    # 操作元素完成后切回主文档
    # driver.switch_to.default_content()
    
  • 移除重复点击操作
    你代码中同时使用了execute_script("arguments[0].click();")和random_element.click(),可能导致元素状态冲突,保留其中一种点击方式即可。

  • 过滤不可交互的元素
    通过find_elements获取的列表可能包含隐藏、禁用的无效元素,先过滤出可交互的:

    elements = driver.find_elements(By.CLASS_NAME,'custom-control-input')
    # 仅保留可见且启用的元素
    valid_elements = [elem for elem in elements if elem.is_displayed() and elem.is_enabled()]
    if valid_elements:
        random_element = random.choice(valid_elements)
        random_element.click()
    
  • 使用ActionChains模拟真实点击
    模拟用户真实的点击动作,绕过部分页面交互限制:

    from selenium.webdriver.common.action_chains import ActionChains
    actions = ActionChains(driver)
    actions.click(random_element).perform()
    
  • 等待元素完全就绪
    组合多个等待条件,确保元素可见、可点击且未被遮挡:

    wait = WebDriverWait(driver, 15)
    target_element = wait.until(EC.and_(
        EC.visibility_of(random_element),
        EC.element_to_be_clickable(random_element)
    ))
    target_element.click()
    

内容的提问来源于stack exchange,提问作者Carl Carl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:15:36