web自动化测试-Selenium04_iframe切换、窗口切换

文章目录


(一)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("所有表单填写完成!")

四、核心总结

  1. 核心流程:主页面操作 → 切换iframe → iframe内操作 → 切回主页面 → 切换其他iframe
  2. 关键语法:切换iframe用driver.switch_to.frame("name/id"),切回主页面用driver.switch_to.default_content()
  3. 避坑关键:操作哪个iframe的元素,就必须先切换到哪个iframe;切换新iframe前,务必切回主页面。
  4. 实际应用: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]):窗口打开顺序可能变化,索引不稳定。


相关推荐
B站计算机毕业设计之家6 小时前
Python招聘数据分析可视化系统 Boss直聘数据 selenium爬虫 Flask框架 数据清洗(附源码)✅
爬虫·python·selenium·机器学习·数据分析·flask
天才测试猿9 小时前
Selenium三大等待详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
wearegogog1239 小时前
用docker搭建selenium grid分布式环境
分布式·selenium·docker
安冬的码畜日常13 小时前
【JUnit实战3_26】第十五章:表现层测试(下)—— Selenium 在网页测试中的用法
selenium·测试工具·junit·gui测试·junit5·表现层测试
景彡先生2 天前
Python Selenium详解:从入门到实战,Web自动化的“瑞士军刀”
前端·python·selenium
xiecoding.cn2 天前
Selenium IDE下载和安装教程(附安装包)
selenium·测试工具·selenium安装·selenium ide·selenium ide下载·selenium下载
程序员三藏3 天前
如何使用Selenium做自动化测试?
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
天才测试猿4 天前
Selenium定位元素的方法css和xpath的区别
css·自动化测试·软件测试·python·selenium·测试工具·测试用例
程序员小远4 天前
selenium元素定位---(元素点击交互异常)解决方法
自动化测试·软件测试·python·selenium·测试工具·测试用例·交互