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

Selenium执行execute_script后出现stale element not found in current frame异常

解决Selenium操作iframe内日期选择器时的StaleElementReferenceException异常

问题原因

  1. 执行JavaScript移除readonly属性后,页面DOM可能发生重渲染,导致之前定位的元素引用失效
  2. 原代码中通过document.getElementsByClassName二次查找元素,存在定位不准确或元素被DOM替换的风险
  3. 用time.sleep固定等待不够稳定,无法确保元素完全加载或DOM状态稳定

解决方案

改用显式等待替代固定等待,直接操作已定位的元素对象,避免不必要的DOM二次查找:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver.get(DATA_ASSERTS)

# 显式等待iframe加载完成并切换
iframe = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.TAG_NAME, "iframe"))
)
driver.switch_to.frame(iframe)

# 等待日期输入框出现并定位
input_element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, '//div/input[@placeholder="date"]'))
)

# 直接操作已定位的元素移除readonly属性
driver.execute_script('arguments[0].removeAttribute("readonly");', input_element)

# 等待元素可交互后再执行清除/输入操作
target_input = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//div/input[@placeholder="date"]'))
)
target_input.clear()
target_input.send_keys("2024-05-20")  # 替换为你需要的日期

备选方案(若仍出现异常)

如果DOM重渲染导致iframe内元素完全失效,可以尝试切换框架后重新定位:

# 移除readonly后切换回父框架再重新进入iframe
driver.switch_to.parent_frame()
iframe = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.TAG_NAME, "iframe"))
)
driver.switch_to.frame(iframe)

# 重新等待元素可交互
target_input = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//div/input[@placeholder="date"]'))
)
target_input.clear()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:52:40