文章目录
- (一)frame(废弃)与iframe切换
 - 
- 一、frame已淘汰,iframe成标准
 - 
- [1. 两者本质区别](#1. 两者本质区别)
 - [2. 自动化测试核心认知](#2. 自动化测试核心认知)
 
 - 二、Selenium中iframe切换核心语法
 - 
- [1. 切换到iframe(3种常用方式)](#1. 切换到iframe(3种常用方式))
 - [2. 切回主页面(关键!)](#2. 切回主页面(关键!))
 - [3. 多层iframe切换](#3. 多层iframe切换)
 
 - 三、实战案例:iframe切换+多表单填写
 - 
- [1. 案例场景](#1. 案例场景)
 - [2. 完整代码](#2. 完整代码)
 
 - 四、核心总结
 
 - (二)窗口切换
 - 
- 一、窗口切换核心概念
 - 
- [1. 什么是窗口句柄?](#1. 什么是窗口句柄?)
 - [2. 核心语法(必记)](#2. 核心语法(必记))
 
 - [二、实战案例:窗口切换 + 注册 A 页面填写](#二、实战案例:窗口切换 + 注册 A 页面填写)
 - 
- [1. 案例场景](#1. 案例场景)
 - [2. 案例前提](#2. 案例前提)
 - [3. 完整代码](#3. 完整代码)
 
 - 三、关键步骤拆解
 - 
- [1. 记录主窗口句柄](#1. 记录主窗口句柄)
 - [2. 打开新窗口后的等待](#2. 打开新窗口后的等待)
 - [3. 遍历窗口句柄切换](#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种常用方式)
            
            
              python
              
              
            
          
          # 方式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. 切回主页面(关键!)
            
            
              python
              
              
            
          
          # 从iframe切回主页面DOM上下文
driver.switch_to.default_content()
        3. 多层iframe切换
若存在iframe嵌套(iframe里套iframe),需逐层切换,切回时也需逐层返回:
            
            
              python
              
              
            
          
          # 主页面 → 父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. 完整代码
            
            
              python
              
              
            
          
          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 网页" 链接,标签如下:
            
            
              html
              
              
            
          
          <a href="注册A.html" id="ZCA" target="_blank">注册A网页</a>
        「注册 A.html」有表单元素(假设 ID:userA、passwordA、telA等)。
3. 完整代码
            
            
              python
              
              
            
          
          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]):窗口打开顺序可能变化,索引不稳定。