首页 / DrissionPage 入门教程 / iframe 操作

DrissionPage 入门教程

iframe 操作

本教程共 42 篇 · 第 35 篇 · 更新于 2026-07-29 · 约 6 分钟阅读

DrissionPageDrissionPage 入门教程iframeChromiumFrame跨域查找

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() 支持这些定位方式:

参数类型说明
intiframe 序号,从 1 开始,负数表示倒数
strCSS 选择器或属性定位
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 对象查找。