Python Selenium调用send_keys时报target frame detached错误如何解决
报错根因
WebDriverException: target frame detached是Selenium操作iframe场景的高频报错,你的代码触发这个问题的原因有三点:
- 语法错误:初始化Edge驱动时参数名写错,
executable path应为executable_path - 切换iframe的逻辑不可靠:页面加载阶段会临时生成iframe节点、且存在iframe重载逻辑,你直接取第一个
iframe标签切入时,很可能切到还没加载完成、或是即将被销毁的临时frame - 缺少元素等待:没有等输入框进入可交互状态就调用
send_keys,加上102版本Edge浏览器和驱动版本不匹配时存在iframe通信的已知bug,很容易触发会话断连
修复步骤
- 先确认本地
msedgedriver.exe的版本和安装的Edge浏览器版本完全一致(均为102.0.1245.44),版本不一致直接替换为同版本驱动 - 弃用直接找标签切iframe的写法,改用显式等待,等目标iframe完全加载可切换后再切入
- 所有输入、点击操作前,都等对应元素进入可点击状态再执行,不要页面刚打开就直接找元素操作
可直接运行的修正代码
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 import time exe_path = "msedgedriver.exe" browser = webdriver.Edge(executable_path=exe_path) browser.implicitly_wait(10) browser.get("https://www.auditanalytics.com/0002/authentication.php") wait = WebDriverWait(browser, 15) # 应对首次加载的iframe重载,短等待兜底 time.sleep(2) # 等iframe可切入后再切换 wait.until(EC.frame_to_be_available_and_switch_to_it((By.TAG_NAME, "iframe"))) # 等邮箱输入框可交互再输入 username = wait.until(EC.element_to_be_clickable((By.ID, "email"))) username.clear() username.send_keys("example@org.com") # 等密码输入框可交互再输入 password = wait.until(EC.element_to_be_clickable((By.ID, "password"))) password.clear() password.send_keys("test") # 后续点击登录按钮同样用wait.until(EC.element_to_be_clickable(定位器)).click()即可
如果关闭了页面的自动化检测提示后还是偶现报错,可以把
time.sleep(2)的时长适当延长,适配你本地的网络加载速度。
内容的提问来源于stack exchange,提问作者Sreejith Vasudevan
相关产品推荐
相关产品推荐

