Selenium 自动化 —— 切换浏览器窗口

更多内容请关注我的 Selenium 自动化 专栏:

  1. 入门和 Hello World 实例
  2. 使用WebDriverManager自动下载驱动
  3. Selenium IDE录制、回放、导出Java源码
  4. 浏览器窗口操作

平时我们在使用浏览器时,通常会打开多个窗口,然后再多个窗口中来回切换,这用鼠标点击或用键盘快捷键是很容易实现的。

但如果我们用 Selenium 自动化时呢?

回答是当然也可以。

1. 默认打开一个窗口

只要我们稍微留意就会发现,多次调用 get() 其实都是打开的同一个窗口,包括 back()forward() 都是在同一个窗口中。

java 复制代码
driver.get("https://www.w3ccoo.com/html/html_forms.html");
Thread.sleep(3000);

driver.get("https://www.baidu.com");
Thread.sleep(3000);

可以看到,两个网页是在同一个窗口中打开的。

2. 打开一个新窗口

那么我们怎么打开一个新窗口呢?

遗憾的时,Selenium WebDriver 并没有直接提供一个类似 newGet() 这样的方法打开新窗口。所以我们只能另辟蹊径。

这就是使用JS。对的,Selenium 也可以执行JavaScript!

java 复制代码
driver.get("https://www.w3ccoo.com/html/html_forms.html");
Thread.sleep(3000);
((JavascriptExecutor) driver).executeScript("window.open();");
Thread.sleep(3000);

这样,就通过JS打开了一个新窗口。

3. 在新窗口中打开网页

接下来,我们继续,想办法在新打开的窗口中打开一个网页。

也许你会觉得很容易,这不是新打开一个窗口吗?直接调用 get() 方法不就行了?

时间是检验真理的唯一标准。

java 复制代码
driver.get("https://www.w3ccoo.com/html/html_forms.html");
Thread.sleep(2000);

((JavascriptExecutor) driver).executeScript("window.open();");
Thread.sleep(2000);

driver.get("https://www.baidu.com");
Thread.sleep(2000);

很不幸,新的网页是在原来的窗口打开的。

有没有办法直接在新窗口打开网页呢?可以直接在open 方法中传参。

java 复制代码
((JavascriptExecutor) driver).executeScript("window.open('https://www.baidu.com');");

4. 句柄

在介绍如何切换窗口前,我们先介绍句柄。

句柄就是浏览器窗口的唯一ID,就像它的身份证。

java 复制代码
driver.get("https://www.w3ccoo.com/html/html_forms.html");
System.out.println(driver.getWindowHandle());

打印的是一串字符串:B761F78733881BCFA236385A487E3EBF

通过这个句柄,我们就能区别浏览器窗口!就可以来回切换。

5. 切换浏览器窗口

下面的代码,做的事情很简单:

  • 找到当前窗口的句柄
  • 打开一个新窗口
  • 拿到所有窗口的句柄
  • 出去步骤1中的窗口,剩下的就是新打开的窗口的句柄
  • 通过 switchTo() 和句柄,切换浏览器窗口
java 复制代码
// 保存当前窗口句柄
driver.get("https://www.w3ccoo.com/html/html_forms.html");
log.info("当前URL:{}", driver.getCurrentUrl());
String originalWindowHandle = driver.getWindowHandle();
log.info("当前句柄:{}", originalWindowHandle);

// 执行JavaScript来打开一个新窗口
((JavascriptExecutor) driver).executeScript("window.open('https://www.baidu.com');");
// 获取所有窗口的句柄列表
Set<String> windowHandles = driver.getWindowHandles();
// 找到新窗口的句柄
String newWindowHandle = null;
for (String handle : windowHandles) {
    if (!handle.equals(originalWindowHandle)) {
        newWindowHandle = handle;
        break;
    }
}
log.info("新句柄:{}", newWindowHandle);
log.info("-------切换后");
driver.switchTo().window(newWindowHandle);
log.info("当前URL:{}", driver.getCurrentUrl());
log.info("当前句柄:{}", driver.getWindowHandle());

到这里,我们已经可以用 Selenium 自由切换浏览器窗口了。关注CSDN - 兰亭序咖啡,和我一起学习探讨 Selenium 自动化和其它技术。

相关推荐
D2aZXN3FhrDa7e2121 小时前
佛山乐从低预算实体店如何选择?看美诚AI自动化获客方案
运维·人工智能·自动化·佛山美诚科技有限公司
蓝创工坊Blue Foundry3 小时前
图片文字提取到 Excel:批量任务如何先定义要交付的字段
运维·服务器·开发语言·数据库·自动化·ocr·excel
见合八方4 小时前
【噪声系数】高偏SOA噪声系数测试方法
网络·自动化·soa·光通信·激光雷达·半导体光放大器
曦尧5 小时前
Microsoft Ontology Playground:面向 Fabric IQ 的零后端本体可视化学习平台
ai·自动化
小白上线*^_^*5 小时前
Jmeter从入门到精通指南
软件测试·测试工具·jmeter·接口测试·测试工程师
AlanBruce6 小时前
从串口仪表到西门子PLC:摩尔信使MThings的多协议设备接入能力
自动化·plc·modbus·mthings·摩尔信使·西门子s7
微硬创新18 小时前
耐达讯自动化 CC-Link IE 转 PROFINET网关在污水厂智能化升级实战
人工智能·物联网·网络协议·自动化·信息与通信
goodesocket20 小时前
手机LPDDR芯片测试座厂商适配性强
测试工具
壮哥_icon1 天前
【Android 系统开发】使用 BAT 脚本高效自动化管理 /system/priv-app/ 系统应用(安装与卸载)
android·运维·自动化
xexpertS1 天前
分布式系统过载治理:如何通过较小服务控制请求节奏
微服务·自动化