iframe 操作
本教程共 42 篇 · 第 35 篇 · 更新于 2026-07-29 · 约 6 分钟阅读
35. iframe 操作
本节目标:搞清楚 iframe 是什么,学会用 DrissionPage 直接操作 iframe 里的元素,不再被嵌套页面搞晕。
iframe 是什么
iframe 就是页面里嵌套的”小窗口”。
它里面装着另一个网页,有自己的 DOM 和 JavaScript 环境。很多网站用它来放登录框、广告、数据表格。
传统工具处理 iframe 要”切入切出”,很烦人。DrissionPage 不用这么麻烦。
获取 iframe 对象
DrissionPage 提供了 get_frame() 方法。
推荐优先使用它,因为 IDE 能正确识别返回的类型。
from DrissionPage import ChromiumPage
page = ChromiumPage()
page.get('https://example.com')
# 用 CSS 选择器定位
iframe = page.get_frame('#my-iframe')
# 用序号获取(从 1 开始)
iframe = page.get_frame(1)
# 获取倒数第一个
iframe = page.get_frame(-1)
get_frame() 支持这些定位方式:
| 参数类型 | 说明 |
|---|---|
int | iframe 序号,从 1 开始,负数表示倒数 |
str | CSS 选择器或属性定位 |
ChromiumFrame | 直接传入 iframe 对象 |
你也可以用获取普通元素的方式拿到 iframe:
iframe = page('t:iframe')
iframe = page.get_frame(iframe) # 包装一下让 IDE 识别
批量获取 iframe
用 get_frames() 可以一次拿多个:
# 获取所有 iframe
all_frames = page.get_frames()
# 按条件筛选
some_frames = page.get_frames('.content-frame')
注意:获取所有 iframe 会比较慢。用到哪个拿哪个就好。
同域与跨域的区别
iframe 和主页面能不能直接穿透,取决于它们是不是同域。
同域:可以直接用页面对象查找 iframe 内部元素。
跨域:必须先获取 ChromiumFrame 对象,再在对象里查找。
# 同域情况 - 直接穿透
page.get('https://example.com/page')
ele = page('text=直接就能找到')
# 跨域情况 - 要先拿到 frame 对象
iframe = page.get_frame(1)
ele = iframe('text=得这样找')
ChromiumFrame 对象
ChromiumFrame 很特殊,它既是元素也是页面。
你可以用它的页面方法:
iframe = page.get_frame(1)
# 当作页面用
iframe.get('https://other.com') # 在 iframe 里跳转
html = iframe.html # 获取内部 HTML
iframe.run_js('alert(1)') # 执行 JS
# 当作元素用
tag = iframe.tag # 'iframe'
src = iframe.attr('src') # 获取 src
iframe.click() # 点击
嵌套 iframe 的处理
iframe 里套 iframe 的情况也很常见。
DrissionPage 支持链式穿透:
# 一层层深入
outer = page.get_frame('#outer')
inner = outer.get_frame('#inner')
target = inner.ele('#target')
# 或者写成一行
target = page.get_frame('#outer').get_frame('#inner').ele('#target')
警告:嵌套 iframe 用序号定位可能不准确。建议用选择器或 id 定位。
等待 iframe 加载
动态加载的 iframe 需要等一等:
# 等待 iframe 出现
page.wait.ele_display('#dynamic-iframe')
# 获取 frame 后再等内部元素
iframe = page.get_frame('#dynamic-iframe')
iframe.wait.ele_display('#content-loaded')
# 现在可以安全操作
iframe.ele('#submit').click()
实用技巧
获取 iframe 的 URL
iframe = page.get_frame(1)
url = iframe.attr('src')
print(f'iframe 地址: {url}')
在 iframe 里执行 JS
iframe = page.get_frame('#editor')
title = iframe.run_js('return document.title;')
print(f'iframe 标题: {title}')
截图
iframe = page.get_frame(1)
iframe.get_screenshot('iframe_screenshot.png')
小结
DrissionPage 处理 iframe 不需要切入切出,比传统工具方便很多。
核心就三件事:用 get_frame() 获取对象,同域直接穿透,跨域用 frame 对象查找。