当前位置: 首页 > news >正文

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

四、核心总结

  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 网页” 链接,标签如下:

<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]):窗口打开顺序可能变化,索引不稳定。


http://www.dtcms.com/a/560924.html

相关文章:

  • 分类与回归算法(一)- 模型评价指标
  • 浙江十大建筑公司排名用v9做网站优化
  • 江门网站建设自助建站站内seo和站外seo区别
  • 嵌入式Linux:线程同步(自旋锁)
  • RHCE复习第一次作业
  • 2025年山西省职业院校技能大赛应用软件系统开发赛项竞赛样题
  • 铁路机车乘务员心理健康状况的研究进展
  • 人才市场官方网站装修公司网站平台
  • Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
  • 【软件安全】什么是AFL(American Fuzzy Lop)基于覆盖率引导的模糊测试工具?
  • 山西省最新干部调整佛山网站建设优化
  • 背包DP合集
  • Docker 拉取镜像:SSL 拦截与国内镜像源失效问题解决
  • full join优化改写经验
  • 软件测试:黑盒测试用例篇
  • 【Linux】Linux第一个小程序 - 进度条
  • ubuntu新增用户
  • 青州市网站建设长沙招聘网58同城招聘发布
  • 江苏中南建设集团网站是多少长沙互联网网站建设
  • 从零开始的云原生之旅(十一):压测实战:验证弹性伸缩效果
  • 民宿网站的建设wordpress gallery
  • 【开题答辩全过程】以 广州网红点打卡介绍网站为例,包含答辩的问题和答案
  • Taro 源码浅析
  • Chart.js 混合图:深度解析与应用技巧
  • redis 大key、热key优化技巧|空间存储优化|调优技巧(一)
  • 监视你的脚本:自动 Linux 活动审计
  • 15.1.2.linux常见操作用例
  • 【Java Web学习 | 第五篇】CSS(4) -盒子模型
  • ubuntu samba 快速安装启用
  • 【数据结构】用顺序表实现通讯录