Selenium执行execute_script后出现stale element not found in current frame异常
解决Selenium操作iframe内日期选择器时的StaleElementReferenceException异常
问题原因
- 执行JavaScript移除
readonly属性后,页面DOM可能发生重渲染,导致之前定位的元素引用失效 - 原代码中通过
document.getElementsByClassName二次查找元素,存在定位不准确或元素被DOM替换的风险 - 用
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
相关产品推荐
相关产品推荐

