Selenium-Java版(frame切换/窗口切换)
frame切换/窗口切换
前言
切换到frame
原因
解决
切换回原来的主html
切换到新的窗口
问题
解决
回到原窗口
法一
法二
示例
前言
参考教程:Python + Selenium Web自动化 2024版 - 自动化测试 爬虫_哔哩哔哩_bilibili
上期文章:Selenium-Java版(css表达式)-CSDN博客
切换到frame
运行代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;import java.time.Duration;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {// 创建WebDriver对象WebDriver wd = new EdgeDriver();wd.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));// 访问目标网页wd.get("https://www.byhy.net/cdn2/files/selenium/sample2.html");// 根据class name选择元素,返回的是一个列表List<WebElement> elements = wd.findElements(By.className("plant"));// 遍历列表并打印每个元素的文本内容for (WebElement element : elements) {System.out.println(element.getText());}// 创建Scanner对象等待用户输入Scanner scanner = new Scanner(System.in);System.out.println("等待回车键结束程序");scanner.next();// 关闭浏览器wd.quit();}
发现并没有打印元素的文本内容
原因
这些元素是在一个叫iframe的元素中的
frame元素或者iframe元素的内部会包含一个被嵌入的另一份html文档。使用selenium打开一个网页的操作范围并不包含被嵌入的html文档里面的内容。
解决
操作被嵌入的html文档中的元素,需要切换操作范围
到被嵌入的文档中。
使用 WebDriver 对象的switchTo属性,三选一:
括号内填id
wd.switchTo().frame("frame1");
括号内填class属性值
wd.switchTo().frame("innerFrame");
括号内填frame对应的WebElement对象
wd.switchTo().frame(wd.findElement(By.tagName("iframe")));
上面例子的正确代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;import java.time.Duration;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {// 创建WebDriver对象WebDriver wd = new EdgeDriver();wd.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));// 访问目标网页wd.get("https://www.byhy.net/cdn2/files/selenium/sample2.html");// 切换到名为 'frame1' 的 framewd.switchTo().frame("frame1");// 根据class name选择元素,返回的是一个列表List<WebElement> elements = wd.findElements(By.className("plant"));// 遍历列表并打印每个元素的文本内容for (WebElement element : elements) {System.out.println(element.getText());}// 创建Scanner对象等待用户输入Scanner scanner = new Scanner(System.in);System.out.println("等待回车键结束程序");scanner.next();// 关闭浏览器wd.quit();}
}
运行框打印出了内容
切换回原来的主html
wd.switchTo().defaultContent();
假如操作完frame里面的元素后,需要点击主html里面的按钮
运行代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;import java.time.Duration;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {// 创建WebDriver对象WebDriver wd = new EdgeDriver();wd.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));// 访问目标网页wd.get("https://www.byhy.net/cdn2/files/selenium/sample2.html");// 根据name属性值 'innerFrame',切换到iframe中wd.switchTo().frame("innerFrame");// 根据 class name 选择元素,返回的是 一个列表List<WebElement> elements = wd.findElements(By.className("plant"));// 遍历列表并打印每个元素的文本内容for (WebElement element : elements) {System.out.println(element.getText());}// 切换回 最外部的 HTML 中wd.switchTo().defaultContent();// 然后再 选择操作 外部的 HTML 中 的元素wd.findElement(By.id("outerbutton")).click();// 创建Scanner对象等待用户输入Scanner scanner = new Scanner(System.in);System.out.println("等待回车键结束程序");scanner.next();// 关闭浏览器wd.quit();}
}
查看自动打开的网站
切换到新的窗口
问题
运行代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;import java.time.Duration;
import java.util.Scanner;public class Main {public static void main(String[] args) {// 创建WebDriver对象WebDriver wd = new EdgeDriver();wd.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));// 访问目标网页wd.get("https://www.byhy.net/cdn2/files/selenium/sample3.html");// 点击打开新窗口的链接WebElement link = wd.findElement(By.tagName("a"));link.click();// wd.getTitle()方法是当前窗口的标题栏文本System.out.println(wd.getTitle());// 创建Scanner对象等待用户输入Scanner scanner = new Scanner(System.in);System.out.println("等待回车键结束程序");scanner.next();// 关闭浏览器wd.quit();}
}
运行框
虽然打开了新窗口,但输出的不是新窗口标题,而是老窗口的标题
解决
点击链接和输出标题的中间加入如下代码
// 获取所有窗口句柄Set<String> windowHandles = wd.getWindowHandles();// 遍历所有窗口句柄for (String handle : windowHandles) {// 先切换到该窗口wd.switchTo().window(handle);// 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口if (wd.getTitle().contains("Microsoft")) {// 如果是,那么这时候WebDriver对象就是对应的该窗口,正好,跳出循环break;}}
运行框
回到原窗口
法一
和切换新窗口用同样的方法,只需换一行代码
wd.getTitle().contains("白月黑羽")
法二
遍历窗口句柄之前,提前保存当前窗口句柄
// mainWindow变量保存当前窗口的句柄String mainWindow = wd.getWindowHandle();
新窗口操作完后,将driver对应的对象返回到原来的窗口
// 通过前面保存的老窗口的句柄,自己切换到老窗口wd.switchTo().window(mainWindow);
示例
运行代码
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;import java.time.Duration;
import java.util.Scanner;
import java.util.Set;public class Main {public static void main(String[] args) {// 创建WebDriver对象WebDriver wd = new EdgeDriver();wd.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));// 访问目标网页wd.get("https://www.byhy.net/cdn2/files/selenium/sample3.html");// mainWindow变量保存当前窗口的句柄String mainWindow = wd.getWindowHandle();// 点击打开新窗口的链接WebElement link = wd.findElement(By.tagName("a"));link.click();// 获取所有窗口句柄Set<String> windowHandles = wd.getWindowHandles();// 遍历所有窗口句柄for (String handle : windowHandles) {// 先切换到该窗口wd.switchTo().window(handle);// 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口if (wd.getTitle().contains("Microsoft")) {// 如果是,那么这时候WebDriver对象就是对应的该窗口,正好,跳出循环break;}}// 打印当前窗口的标题栏文本System.out.println(wd.getTitle());// 通过前面保存的老窗口的句柄,自己切换到老窗口wd.switchTo().window(mainWindow);// 打印切换回老窗口后的标题栏文本System.out.println(wd.getTitle());// 创建Scanner对象等待用户输入Scanner scanner = new Scanner(System.in);System.out.println("等待回车键结束程序");scanner.next();// 关闭浏览器wd.quit();}
}
运行框
不仅仅适用于最初的老窗口,操作期间打开的其他窗口都可以保留其窗口句柄
相关文章:

Selenium-Java版(frame切换/窗口切换)
frame切换/窗口切换 前言 切换到frame 原因 解决 切换回原来的主html 切换到新的窗口 问题 解决 回到原窗口 法一 法二 示例 前言 参考教程:Python Selenium Web自动化 2024版 - 自动化测试 爬虫_哔哩哔哩_bilibili 上期文章:Sel…...

一文深度解析:Pump 与 PumpSwap 的协议机制与技术差异
在 Solana 链上,Pump.fun 和其延伸产品 PumpSwap 构成了 meme coin 发行与流通的两大核心场景。从初期的游戏化发行模型,到后续的自动迁移与交易市场,Pump 系列协议正在推动 meme coin 从“爆发性投机”走向“协议化运营”。本文将从底层逻辑…...

星云智控v1.0.0产品发布会圆满举行:以创新技术重构物联网监控新生态
星云智控v1.0.0产品发布会圆满举行:以创新技术重构物联网监控新生态 2024年5月15日,成都双流蛟龙社区党群服务中心迎来了一场备受业界瞩目的发布会——优雅草科技旗下”星云智控v1.0.0”物联网AI智控系统正式发布。本次发布会吸引了包括沃尔沃集团、新希…...

SpringBoot(一)--- Maven基础
目录 前言 一、初始Maven 1.依赖管理 2.项目构建 3.统一项目结构 二、IDEA集成Maven 1.Maven安装 2.创建Maven项目 2.1全局设置 2.2 创建SpringBoot项目 2.3 常见问题 三、单元测试 1.JUnit入门 2.断言 前言 Maven 是一款用于管理和构建Java项目的工具ÿ…...

基于FPGA控制电容阵列与最小反射算法的差分探头优化设计
在现代高速数字系统测试中,差分探头的信号完整性直接影响测量精度。传统探头存在阻抗失配导致的信号反射问题,本文提出一种通过FPGA动态控制电容阵列,结合最小反射算法的优化方案,可实时调整探头等效容抗,将信号反射损…...

kakfa 基本了解
部署结构 Kafka 使用zookeeper来协商和同步,但是kafka 从版本3.5正式开始deprecate zookeeper, 同时推荐使用自带的 kraft. 而从4.0 开始则不再支持 zookeeper。 所以 kafka 是有control plane 和 data plane 的。 data plane 就是broker,control plane…...
基于Browser Use + Playwright 实现AI Agent操作Web UI自动化
Browser Use是什么 Browser Use是一个开源项目官网:Browser Use - Enable AI to control your browser,专为大语言模型(LLM)设计的只能浏览器工具,能够让AI像人类一样自然的浏览和操作网页,支持多标签页管…...

Origin绘制多因子柱状点线图
多因子柱状点线图是一种结合柱状图和点线图的复合图表,常用于同时展示多个因子(变量)在不同分组下的分布和趋势变化。 适用场景: (1)比较多个因子在不同分组中的数值大小(柱状图)&a…...

Web漏洞扫描服务的特点与优势:守护数字时代的安全防线
在数字化浪潮中,Web应用程序的安全性已成为企业业务连续性和用户信任的核心要素。随着网络攻击手段的不断升级,Web漏洞扫描服务作为一种主动防御工具,逐渐成为企业安全体系的标配。本文将从特点与优势两方面,解析其价值与应用场景…...
iOS 直播技术及优化
iOS直播技术的实现和优化涉及多个技术环节,需结合协议选择、编解码方案、播放器技术及性能调优等多方面。 一、核心技术实现 协议选择与传输优化 HLS(HTTP Live Streaming):苹果官方推荐,基于HTTP分片传输,…...

抛弃传统P2P技术,EasyRTC音视频基于WebRTC打造教育/会议/远程巡检等场景实时通信解决方案
一、方案背景 随着网络通信发展,实时音视频需求激增。传统服务器中转方式延迟高、资源消耗大,WebP2P技术由此兴起。EasyRTC作为高性能实时通信平台,集成WebP2P技术,实现低延迟、高效率音视频通信,广泛应用于教育、医疗…...

俄罗斯军总参情报局APT28组织瞄准援乌后勤供应链发起全球网络攻击
2025年5月,由美国、英国、欧盟和北约网络安全与情报机构联合发布的最新网络安全公告披露,俄罗斯军总参情报局(GRU)第85特别服务中心第26165部队(又称APT28、Fancy Bear、Forest Blizzard和BlueDelta)正持续…...

杰发科技AC7801——PWM获取固定脉冲个数
测试通道6 在初始化时候打开通道中断 void PWM1_GenerateFrequency(void) {PWM_CombineChConfig combineChConfig[1]; //组合模式相关结构体PWM_IndependentChConfig independentChConfig[2];//独立模式相关结构体PWM_ModulationConfigType pwmConfig; //PWM模式相关结构体PWM…...

MacBookPro上macOS安装第三方应用报错解决方案:遇到:“无法打开“XXX”,因为无法确定(验证)开发者身份?怎么解决
MacBook Pro 上 macOS 安装第三方应用报错解决方案 —— 彻底搞定「无法打开“XXX”,因为无法确定开发者身份」 适用系统:macOS Catalina 10.15 ~ macOS Sonoma 14.x 适用机型:Intel / Apple Silicon 全系 MacBook Pro 文章目录 **MacBook P…...
MVC和MVVM架构的区别
MVC和MVVM都是前端开发中常用的设计模式,都是为了解决前端开发中的复杂性而设计的,而MVVM模式则是一种基于MVC模式的新模式。 MVC(Model-View-Controller)的三个核心部分:模型、视图、控制器相较于MVVM(Model-View-ViewModel)的三个核心部分…...

RAG(Retrieval-Augmented-Generation)检索增强生成
什么是RAG(检索增强生成)? RAG是一种AI框架,结合传统的数据检索技术和LLM(大语言模型)的优势,通过将外部数据和LLM生成语言技能集合,对LLM的输出进行优化,使输出更准确、…...

黑马点评前端Nginx启动失败问题解决记录
Nginx启动失败问题解决记录 问题描述 在学习黑马Redis课程时,启动黑马点评Nginx前端项目发现: 无法访问8080端口检查Windows端口占用情况(无占用)结论:Nginx服务未成功启动 错误日志分析 在nginx安装目录下的logs…...

第12天-Python+Qt5开发实战:10大经典案例与深度解析
1. 基础窗口与信号槽机制 python 复制 下载 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButtonclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("信号槽示例")btn = QPushButton("…...
软件开发命名避开保留关键字指南
在软件开发中,命名时避开保留关键字至关重要,否则可能导致语法错误、逻辑混乱或兼容性问题。以下是需要注意事项及具体建议: 1. 识别保留关键字 数据库系统:不同数据库的保留关键字不同,需查阅官方文档。 MySQL&#x…...
力扣第450场周赛
Q1. 数位和等于下标的最小下标 给你一个整数数组 nums 。 返回满足 nums[i] 的数位和(每一位数字相加求和)等于 i 的 最小 下标 i 。 如果不存在满足要求的下标,返回 -1 。 示例 1: 输入:nums [1,3,2] 输出࿱…...
React-改变当前页class默认的样式
比如antd for mobile,已经定义了默认的ui的class样式,如果想在当前页面的控件显示特殊的样式,除了指定style外,还可以强制改变默认class的样式,比如我想改变list.item的字体。 在返回渲染布局里面加上 return (<&…...
zabbix 常见问题
一、zabbix主动模式和被动模式可以同时使用吗? Zabbix 的主动模式(Active Mode)和被动模式(Passive Mode)可以同时启用并共存,但需要满足以下条件: 1、agent配置 在 Zabbix Agent 的配置文件…...

人工智能培训:解锁未来职场竞争力的核心路径与课程内容解析
当AI绘画工具在几秒内生成一幅媲美专业画师的作品,当AI程序员自主优化代码逻辑,当AI客服精准解答复杂问题——一个现实愈发清晰:人工智能正在重新定义“专业能力”的边界。 对于普通人而言,这场变革既带来焦虑,也孕育机…...

深入解析Java泛型:从定义到实战应用
目录 🚀前言🤔泛型的定义🐧泛型类🌟泛型接口✍️泛型方法、通配符、上下限💯泛型方法💯 通配符与上下限⚙️通配符(Wildcard)⚙️泛型上下限⚙️应用场景 🦜泛型支持的类…...

【开源】一个基于 Vue3 和 Electron 开发的第三方网易云音乐客户端,具有与官方客户端相似的界面布局
🎵 XCMusic:高颜值第三方网易云音乐客户端 🎶 📍 项目亮点 XCMusic 是一款基于Vue3Electron开发的开源、跨平台网易云音乐客户端。 此音乐播放器基于 Electron 开发,旨在为用户提供简洁、美观、兼容多平台的音乐体验。…...
【云实验】Excel文件转存到RDS数据库
实验名称:Excel文件转存到RDS数据库 说明:把Excel的数据通过数据管理服务DMS(Data Management Service)导入到RDS MySQL数据库中。 流程:创建一个RDS for MySQL的实例,再创建数据库和账号,通过D…...
从零开始:用Python语言基础构建宠物养成游戏:从核心知识到完整实战
一、代码分段拆解与知识点映射 1. 初始化游戏数据:变量与数据类型的综合应用 # 用字典存储宠物信息(嵌套字典数字/字符串类型) pet {"name": "小雪", # 字符串:宠物名字"age": 1, …...

labview设计一个虚拟信号发生器
目标:设计一个虚拟信号发生器,通过功能键的设置可以产生正弦波、三角波、方波和锯齿波,并可以通过输入控件设置采集信号的频率、幅值、相位等参数。 一、正弦波 (1)创建一个枚举 (2)点击属性后…...

工业路由器WiFi6+5G的作用与使用指南,和普通路由器对比
工业路由器的技术优势 在现代工业环境中,网络连接的可靠性与效率直接影响生产效率和数据处理能力。WiFi 6(即802.11ax)和5G技术的结合,为工业路由器注入了强大的性能,使其成为智能制造、物联网和边缘计算的理想选择。…...
Chrome 插件网络请求的全面指南
在 Chrome 插件开发中,网络请求可以在多个上下文中实现,而不仅限于 background.js 和 content.js。以下是完整的网络请求实现方案: 一、主要请求实现位置 1. Background Script (后台脚本) 特点: 生命周期最长适合处理敏感数据…...