web自动化测试-Selenium04_iframe切换、窗口切换
文章目录
- (一)frame(废弃)与iframe切换
 - 一、frame已淘汰,iframe成标准
 - 1. 两者本质区别
 - 2. 自动化测试核心认知
 
- 二、Selenium中iframe切换核心语法
 - 1. 切换到iframe(3种常用方式)
 - 2. 切回主页面(关键!)
 - 3. 多层iframe切换
 
- 三、实战案例:iframe切换+多表单填写
 - 1. 案例场景
 - 2. 完整代码
 
- 四、核心总结
 
- (二)窗口切换
 - 一、窗口切换核心概念
 - 1. 什么是窗口句柄?
 - 2. 核心语法(必记)
 
- 二、实战案例:窗口切换 + 注册 A 页面填写
 - 1. 案例场景
 - 2. 案例前提
 - 3. 完整代码
 
- 三、关键步骤拆解
 - 1. 记录主窗口句柄
 - 2. 打开新窗口后的等待
 - 3. 遍历窗口句柄切换
 
(一)frame(废弃)与iframe切换
一、frame已淘汰,iframe成标准
1. 两者本质区别
| 特性 | frame(HTML4废弃) | iframe(HTML5标准) | 
|---|---|---|
| 存在形式 | 需嵌套在<frameset>中,分割整个页面 | 独立内联标签,可嵌入页面任意位置 | 
| 兼容性 | 现代浏览器逐步淘汰,测试框架支持弱化 | 所有浏览器、测试框架(Selenium等)原生支持 | 
| 灵活性 | 无法与页面其他元素共存 | 可与表单、按钮等元素共存,支持灵活尺寸控制 | 
| 核心用途 | 早期页面布局分割 | 嵌入独立页面(如子表单、第三方内容) | 
2. 自动化测试核心认知
- 现在做Web自动化测试,无需关注frame(实际项目中几乎不会遇到),重点掌握iframe切换。
 - iframe的核心特点:主页面与iframe是独立的DOM上下文,操作iframe内元素前,必须先“切换到该iframe”;操作完成后,需切回主页面才能操作其他元素。
 
二、Selenium中iframe切换核心语法
1. 切换到iframe(3种常用方式)
# 方式1:通过iframe的name属性(最常用,简单直接)
driver.switch_to.frame("myframe1")  
# 对应页面中<iframe name="myframe1"># 方式2:通过iframe的id属性
driver.switch_to.frame("idframe1")  
# 对应页面中<iframe id="idframe1"># 方式3:先定位iframe元素,再切换(无name/id时用)
iframe_elem = driver.find_element(By.XPATH, "//iframe[@src='注册A.html']")
driver.switch_to.frame(iframe_elem)
 
2. 切回主页面(关键!)
# 从iframe切回主页面DOM上下文
driver.switch_to.default_content()
 
3. 多层iframe切换
若存在iframe嵌套(iframe里套iframe),需逐层切换,切回时也需逐层返回:
# 主页面 → 父iframe → 子iframe
driver.switch_to.frame("parent_frame")
driver.switch_to.frame("child_frame")# 子iframe → 父iframe(向上切一级)
driver.switch_to.parent_frame()# 父iframe → 主页面
driver.switch_to.default_content()
 
三、实战案例:iframe切换+多表单填写
1. 案例场景
打开主页面 → 填写主页面表单 → 切换到iframe1(注册A页面)填写表单 → 切回主页面 → 切换到iframe2(注册B页面)填写表单 → 完成操作。
2. 完整代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time# 1. 初始化浏览器,打开主页面
driver = webdriver.Chrome()
driver.maximize_window()
# 注意:本地文件路径需正确(右键文件→复制路径)
url = r"E:xxx.html"
driver.get(url)
time.sleep(2)  # 简单等待页面加载(入门用,实际可优化为显式等待)# 2. 填写主页面表单(无需切换,直接操作)
print("开始填写主页面表单...")
driver.find_element(By.ID, "user").send_keys("test_admin")  # 主页面账号输入框
driver.find_element(By.ID, "password").send_keys("main123456")  # 主页面密码
driver.find_element(By.ID, "tel").send_keys("13800138000")  # 主页面电话
driver.find_element(By.ID, "email").send_keys("test_main@example.com")  # 主页面邮箱
driver.find_element(By.ID, "pg").click()  # 单选框(苹果)
driver.find_element(By.ID, "gw").click()  # 复选框(购物)
time.sleep(2)# 3. 填写注册A页面(需切换到iframe1)
print("开始填写注册A页面表单...")
# 关键步骤:切换到注册A对应的iframe(name="myframe1")
driver.switch_to.frame("myframe1")
# 操作iframe内的元素(注册A页面表单)
driver.find_element(By.ID, "userA").send_keys("A_test_admin")  # 注册A账号
driver.find_element(By.ID, "passwordA").send_keys("a123456")  # 注册A密码
driver.find_element(By.ID, "telA").send_keys("13900139000")  # 注册A电话
time.sleep(2)# 4. 填写注册B页面(需先切回主页面,再切换到iframe2)
print("开始填写注册B页面表单...")
# 关键步骤1:从iframe1切回主页面(不切回会定位不到iframe2)
driver.switch_to.default_content()
# 关键步骤2:切换到注册B对应的iframe(name="myframe2")
driver.switch_to.frame("myframe2")
# 操作iframe内的元素(注册B页面表单)
driver.find_element(By.ID, "userB").send_keys("B_test_admin")  # 注册B账号
driver.find_element(By.ID, "passwordB").send_keys("b123456")  # 注册B密码
driver.find_element(By.ID, "emailB").send_keys("test_b@example.com")  # 注册B邮箱
time.sleep(3)# 5. 关闭浏览器
driver.quit()
print("所有表单填写完成!")
 
四、核心总结
- 核心流程:主页面操作 → 切换iframe → iframe内操作 → 切回主页面 → 切换其他iframe。
 - 关键语法:切换iframe用
driver.switch_to.frame("name/id"),切回主页面用driver.switch_to.default_content()。 - 避坑关键:操作哪个iframe的元素,就必须先切换到哪个iframe;切换新iframe前,务必切回主页面。
 - 实际应用:iframe常用于嵌入子表单、系统内嵌页面,自动化测试时只要记住“先切换,再操作”的原则,就能解决大部分场景。
 
(二)窗口切换
一、窗口切换核心概念
1. 什么是窗口句柄?
浏览器中每个打开的窗口 / 标签页,都有一个唯一的句柄(handle) —— 一串字符串标识,用于 Selenium 区分不同窗口。
例如:主窗口句柄可能是 CDwindow-8A7F5D2E…,新打开的窗口句柄是 CDwindow-1B3C7E9F…。
2. 核心语法(必记)
| 功能 | 代码 | 说明 | 
|---|---|---|
| 获取当前窗口句柄 | driver.current_window_handle | 返回当前聚焦窗口的唯一标识 | 
| 获取所有窗口句柄 | driver.window_handles | 返回所有已打开窗口的句柄列表(顺序:先开的在前) | 
| 切换到指定窗口 | driver.switch_to.window(handle) | 传入目标窗口的句柄,切换到该窗口 | 
| 关闭当前窗口 | driver.close() | 关闭当前聚焦的窗口,不影响其他窗口 | 
| 关闭所有窗口 | driver.quit() | 关闭浏览器所有窗口,结束会话 | 
二、实战案例:窗口切换 + 注册 A 页面填写
1. 案例场景
打开「注册实例.html」主页面 → 点击 “注册 A 网页” 链接打开新窗口 → 切换到新窗口 → 填写注册 A 页面表单 → 完成操作。
2. 案例前提
主页面「注册实例.html」中存在 “注册 A 网页” 链接,标签如下:
<a href="注册A.html" id="ZCA" target="_blank">注册A网页</a>
 
「注册 A.html」有表单元素(假设 ID:userA、passwordA、telA等)。
3. 完整代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time# 1. 初始化浏览器,打开主页面
driver = webdriver.Chrome()
driver.maximize_window()
# 替换为你的本地文件实际路径(右键文件→复制路径)
url = r"xxx\注册实例.html"
driver.get(url)
time.sleep(2)  # 等待主页面加载完成# 2. 记录主窗口句柄(关键!后续需切回时用)
original_window = driver.current_window_handle
print("主页面句柄:", original_window)# 3. 点击链接,打开新窗口
print("点击「注册A网页」链接,打开新窗口...")
# 定位“注册A网页”链接(通过ID:ZCA)
register_a_link = driver.find_element(By.ID, "ZCA")
register_a_link.click()
time.sleep(3)  # 必须等待新窗口加载(否则切换失败)# 4. 切换到新窗口(注册A页面)
# 步骤1:获取所有窗口句柄(列表形式)
all_windows = driver.window_handles
print("所有窗口句柄:", all_windows)# 步骤2:遍历所有句柄,找到非主窗口的新窗口
for window in all_windows:if window != original_window:  # 排除主窗口句柄driver.switch_to.window(window)  # 切换到新窗口break# 验证切换结果(打印新窗口标题)
print("已切换到注册A页面,标题:", driver.title)
time.sleep(2)# 5. 在新窗口(注册A页面)填写表单
print("开始填写注册A页面信息...")
# 账号(按注册A.html实际ID修改)
driver.find_element(By.ID, "userA").send_keys("window_test_001")
# 密码
driver.find_element(By.ID, "passwordA").send_keys("a123456")
# 电话
driver.find_element(By.ID, "telA").send_keys("13700137000")
# 邮箱(可选)
driver.find_element(By.ID, "emailA").send_keys("test_a_window@example.com")
time.sleep(3)  # 停留查看填写效果# 6. (可选)切回主窗口(如需继续操作主页面)
# driver.switch_to.window(original_window)
# print("切回主页面,标题:", driver.title)# 7. 关闭所有窗口,结束操作
driver.quit()
print("操作完成!")
 
三、关键步骤拆解
1. 记录主窗口句柄
打开新窗口前,必须用 original_window = driver.current_window_handle 记录主窗口句柄。
 原因:新窗口打开后,driver.window_handles 会返回多个句柄,需通过主窗口句柄区分目标窗口。
2. 打开新窗口后的等待
点击链接后,用 time.sleep(3) 等待新窗口完全加载(入门用)。
 进阶优化:用显式等待 WebDriverWait 等待新窗口出现(更稳定)。
3. 遍历窗口句柄切换
用 for window in all_windows 遍历所有句柄,通过 window != original_window 找到新窗口。
 避免用索引(如 all_windows[1]):窗口打开顺序可能变化,索引不稳定。
