frame 切换 / 窗口切换
理解 iframe 和多窗口的概念
掌握 frame 切换和窗口切换的方法
能处理跨 frame、跨窗口的元素定位
核心讲解
(1)iframe 切换iframe 是网页里嵌套的另一个网页,里面的元素和主页面是隔离的,不切换直接定位会找不到元素。
三种切换方式:
按索引切换:
driver.switch_to.frame(0),第一个 iframe按 name/id 切换:
driver.switch_to.frame("frame的name")按元素切换:先定位 iframe 元素,再传进去切换
切回主文档:driver.switch_to.default_content() 切回上一层:driver.switch_to.parent_frame()
点击链接打开新标签页时,驱动不会自动切换,必须手动切换窗口句柄。
获取所有窗口句柄:
driver.window_handles,返回列表获取当前窗口句柄:
driver.current_window_handle切换到指定窗口:
driver.switch_to.window(句柄)
常用技巧:打开新窗口后,取列表最后一个就是最新的窗口。
代码示例
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.maximize_window()
# ===== iframe切换示例 =====
driver.get("https://www.runoob.com/try/try.php?filename=tryhtml_basic")
time.sleep(2)
# 切换到iframe(id是iframeResult)
driver.switch_to.frame("iframeResult")
# 操作iframe里的元素
h1 = driver.find_element(By.TAG_NAME, "h1")
print("iframe里的标题:", h1.text)
# 切回主文档
driver.switch_to.default_content()
# 操作主页面的元素
run_btn = driver.find_element(By.ID, "submitBTN")
print("主页面按钮:", run_btn.text)
# ===== 多窗口切换示例 =====
driver.get("https://www.baidu.com")
time.sleep(1)
# 记录当前窗口
main_window = driver.current_window_handle
# 点击新闻,打开新窗口
driver.find_element(By.LINK_TEXT, "新闻").click()
time.sleep(2)
# 获取所有窗口
all_windows = driver.window_handles
print("窗口数量:", len(all_windows))
# 切换到新窗口(最后一个)
driver.switch_to.window(all_windows[-1])
print("新窗口标题:", driver.title)
# 关闭新窗口
driver.close()
# 切回主窗口
driver.switch_to.window(main_window)
print("回到主窗口:", driver.title)
driver.quit()
常见误区
不切换直接定位:90% 的 iframe 定位失败,都是因为没切换 frame
切出去忘记切回来:操作完 iframe 要切回主文档,否则后续定位主页面元素会失败
窗口句柄顺序搞混:不是按打开顺序排列,不要想当然用索引
close 和 quit 混淆:close 只关当前窗口,驱动还在;quit 退出整个驱动
课后练习
找一个带 iframe 的登录页面,切换进去输入账号密码
实现:打开多个链接,切换到每个窗口打印标题,最后回到第一个窗口
思考:嵌套 iframe(iframe 里还有 iframe)怎么切换?

