《手把手教你》系列技巧篇(二十三)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换下卷(详细教程)
1.简介
上一篇讲解和分享了如何获取浏览器窗口的句柄,那么今天这一篇就是讲解获取后我们要做什么,就是利用获取的句柄进行浏览器窗口的切换来分别定位不同页面中的元素进行操作。
2.为什么要切换窗口?
Selenium在当前页面打开了新的窗口,此时就需要跳转到新的窗口去,就需要把窗口进行切换。宏哥这里简单举例一个测试场景,你在页面A点击一个连接,会在新的tab窗口打开页面B,这个时候,你在页面B点击一个连接,会在新的tab窗口打开页面C。这种情况,在测试中经常遇到,自动化中,webdriver是如何处理的呢。这里就需要用到今天讲解和分享的知识了。
3.获取窗口句柄方法
获取所有(set<String>):
//获取所有打开窗口句柄,返回的是set类型
Set<String> handles = driver.getWindowHandles();
获取当前(String类型):
//获取当前窗口句柄,返回的是string类型
String handle = driver.getWindowHandle();
窗口切换方法:
//窗口切换方法,需传入想要切换窗口的句柄
driver.switchTo().window();
switch_to_window(window_name):
将定位的页面转到指定的window_name页面(window_name:指定页面窗口的handle)
4.项目实战
1.打开百度首页
2.从百度首页打开新闻,在新闻页面输入框输入“阿富汗”
3.从百度首页打开地图,在地图页面输入框输入“北京”
4.1代码设计

4.2参考代码
package lessons; import java.util.ArrayList;
import java.util.Set;
import java.util.concurrent.TimeUnit; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver; /**
* @author 北京-宏哥
*
*《手把手教你》系列技巧篇(二十二)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换(详细教程)
*
* 2021年8月27日
*/
public class SwitchWinId { public static void main(String [] args) throws InterruptedException { System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); //指定驱动路径 WebDriver driver =null;
try {
driver = new ChromeDriver();
driver.get("http://wwww.baidu.com");
driver.manage().window().maximize();
//driver.findElement(By.id("kw")).sendKeys("北京宏哥");
Thread.sleep(2000);
//获取主页面1句柄
String handle1 = driver.getWindowHandle();
System.out.println("百度主页面1句柄:"+handle1);
//点击页面2的新闻超链接跳转后,在页面2文本框输入数据
Thread.sleep(2000);
driver.findElement(By.xpath("//div/a[text()='新闻']")).click();
String handle = getLastHandle(driver);
System.out.println("新闻页面2句柄:"+handle);
//获取到页面2的句柄,将driver作用域切到页面2
driver.switchTo().window(handle);
driver.findElement(By.id("ww")).sendKeys("阿富汗");
Thread.sleep(2000);
//返回主页面1点击打开新页面3
//利用页面1的句柄,将driver作用域切回到页面1
driver.switchTo().window(handle1);
//点击页面3的超链接跳转后,在页面3文本框输入数据
driver.findElement(By.xpath("//div/a[text()='地图']")).click();
handle = getLastHandle(driver);
System.out.println("地图页面3句柄:"+handle);
driver.switchTo().window(handle);
driver.findElement(By.id("sole-input")).sendKeys("北京");
Thread.sleep(2000);
//关闭新打开的页面窗口3
driver.close();
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}finally {
driver.quit();
}
} /**
* @param driver
* @return 当前打开窗口的最后一个句柄
*/
public static String getLastHandle(WebDriver driver) {
//获取当前打开窗口的所有句柄
Set<String> Allhandles = driver.getWindowHandles();
ArrayList<String> lst = new ArrayList<String>(Allhandles);
return lst.get(lst.size()-1);
} }
4.3运行代码
1.运行代码,右键Run AS->java Application,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:
5.小结
细心地小伙伴或者童鞋们或许发现宏哥代码中注释一行代码是在百度首页的输入框输入“北京宏哥”的,一定很好奇宏哥为什么将其注释掉了。宏哥这里说一下原因:因为加上这一行后,就会定位不到元素(报错),注释掉就好了。具体原因宏哥还没找到,有知道的小伙伴或者童鞋们可以给宏哥留言哈!
6.拓展
针对小结中的问题,宏哥自己在本地写代码实现了一个小demo,是可以在第一个主页面输入文字的,也没有报错。
6.1准备三个页面
1.html
<html>
<head>
<title>百度</title>
</head>
<body>
<div>
百度 :<input type="text" id="input_1" value=""/><br><br>
<a href="./2.html" target="_blank">点击这里跳转新闻页面</a><br><br>
<a href="./3.html" target="_blank">点击这里跳转地图页面</a><br><br>
</div>
</body>
</html>
2.html
<html>
<head>
<title>新闻</title>
</head>
<body>
<div>
新闻:<input type="text" id="input_2"/>
</div>
</body>
</html>
3.html
<html>
<head>
<title>地图</title>
</head>
<body>
<div>
地图:<input type="text" id="input_3"/>
</div>
</body>
</html>
6.2新建一个测试类
新建一个Test.class类。
6.2.1代码设计

6.2.2参考代码
/**
*
*/
package lessons; import java.util.ArrayList;
import java.util.Set; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver; /**
* @author 北京-宏哥
*
* 2021年8月24日
*/
public class Test { public static void main(String[] args) throws InterruptedException {
System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); //指定驱动路径
WebDriver driver =null;
try {
driver = new ChromeDriver();
driver.get("file:///C:/Users/DELL/Desktop/test/1.html");
driver.manage().window().maximize();
driver.findElement(By.id("input_1")).sendKeys("百度写入数据");
Thread.sleep(2000);
//获取百度句柄
String handle1 = driver.getWindowHandle();
System.out.println("百度句柄:"+handle1);
//点击新闻的超链接跳转后,在新闻文本框输入数据
driver.findElement(By.partialLinkText("点击这里跳转新闻")).click();
String handle = getLastHandle(driver);
System.out.println("新新闻句柄:"+handle);
//获取到新闻的句柄,将driver作用域切到新闻
driver.switchTo().window(handle);
driver.findElement(By.id("input_2")).sendKeys("新打开新闻 输入数据"); //返回百度点击打开新页面3
//利用页面1的句柄,将driver作用域切回到页面1
driver.switchTo().window(handle1);
//点击页面3的超链接跳转后,在页面3文本框输入数据
driver.findElement(By.partialLinkText("点击这里跳转地图")).click();
handle = getLastHandle(driver);
System.out.println("地图句柄:"+handle);
driver.switchTo().window(handle);
driver.findElement(By.id("input_3")).sendKeys("新打开地图 输入数据");
Thread.sleep(2000);
//关闭新打开的地图
//driver.close();
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}finally {
driver.quit();
}
} /**
* @param driver
* @return 当前打开窗口的最后一个句柄
*/
public static String getLastHandle(WebDriver driver) {
//获取当前打开窗口的所有句柄
Set<String> Allhandles = driver.getWindowHandles();
ArrayList<String> lst = new ArrayList<String>(Allhandles);
return lst.get(lst.size()-1);
} }
6.2.3运行代码
1.运行代码,右键Run AS->java Application,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:
《手把手教你》系列技巧篇(二十三)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换下卷(详细教程)的更多相关文章
- 《手把手教你》系列基础篇之(三)-java+ selenium自动化测试- 启动三大浏览器(上)(详细教程)
1.简介 前边宏哥已经将环境搭建好了,今天就在Java项目搭建环境中简单地实践一下: 启动三大浏览器.按市场份额来说,全球前三大浏览器是:IE.Firefox.Chrome.因此宏哥这里主要介绍一下如 ...
- 《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
1.简介 页面对象模型(Page Object Model)在Selenium Webdriver自动化测试中使用非常流行和受欢迎,作为自动化测试工程师应该至少听说过POM这个概念.本篇介绍POM的简 ...
- 《手把手教你》系列技巧篇(八)-java+ selenium自动化测试-元素定位大法之By id(详细教程)
1.简介 从这篇文章开始,要介绍web自动化核心的内容,也是最困难的部分了,就是:定位元素,并去对定位到的元素进行一系列相关的操作.想要对元素进行操作,第一步,也是最重要的一步,就是要找到这个元素,如 ...
- 《手把手教你》系列技巧篇(九)-java+ selenium自动化测试-元素定位大法之By name(详细教程)
1.简介 上一篇宏哥已经介绍了通过id来定位元素,今天继续介绍其他剩下的七种定位方法中的通过name来定位元素.本文来介绍Webdriver中元素定位方法之By name,顾名思义,就是我们想要定位的 ...
- 《手把手教你》系列技巧篇(二十七)-java+ selenium自动化测试- quit和close的区别(详解教程)
1.简介 尽管有的小伙伴或者童鞋们觉得很简单,不就是关闭退出浏览器,但是宏哥还是把两个方法的区别说一下,不然遇到坑后根本不会想到是这里的问题. 2.源码 本文介绍webdriver中关于浏览器退出操作 ...
- 《手把手教你》系列技巧篇(二十九)-java+ selenium自动化测试- Actions的相关操作上篇(详解教程)
1.简介 有些测试场景或者事件,Selenium根本就没有直接提供方法去操作,而且也不可能把各种测试场景都全面覆盖提供方法去操作.比如:就像鼠标悬停,一般测试场景鼠标悬停分两种常见,一种是鼠标悬停在某 ...
- 《手把手教你》系列技巧篇(三十二)-java+ selenium自动化测试-select 下拉框(详解教程)
1.简介 在实际自动化测试过程中,我们也避免不了会遇到下拉选择的测试,因此宏哥在这里直接分享和介绍一下,希望小伙伴或者童鞋们在以后工作中遇到可以有所帮助. 2.select 下拉框 2.1Select ...
- 《手把手教你》系列技巧篇(五十二)-java+ selenium自动化测试-处理面包屑(详细教程)
1.简介 面包屑(Breadcrumb),又称面包屑导航(BreadcrumbNavigation)这个概念来自童话故事"汉赛尔和格莱特",当汉赛尔和格莱特穿过森林时,不小心迷路了 ...
- 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)
1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...
随机推荐
- 第五篇--VS2017如何生成Dll文件
参考资料: https://blog.csdn.net/qq_34097715/article/details/79540933 https://www.cnblogs.com/RascallySna ...
- 又一本springmvc学习指南 之---第22篇 springmvc 加载.xml文件的bean标签的过程
writedby 张艳涛,今天看spring mvc 学习指南的第2章,特意提下这个作者是how tomcat works 俩个作者之一, 喜欢上一本书的风格,使用案例来讲述原理, 在做第一个案例的时 ...
- tp phpexcel 导入后台访问方法
public function addall(){ $Water = M('Waterrate'); $config = array( 'maxSize' => 0, 'rootPath' =& ...
- 学习笔记-CCS-MSP430F5529[快速入门篇二]
由于2021的全国电赛延期了,从今天开始打算好好整理一下使用CCS编程的经验,本篇笔记会好好整理一下我备赛期间用CCS写的程序,包括外部中断,定时器部分的定时中断,定时器输入捕获,PWM波输出,UAR ...
- TCP拥塞控制详解
1. 拥塞原因与代价 拥塞的代价 当分组的到达速率接近链路容量时,分组经历巨大的排队时延. 发送方必须执行重传以补偿因为缓存溢出而丢弃的分组. 发送方在遇到大时延时进行的不必要重传会引起路由器利用其链 ...
- 解决ftp登录问题:500 OOPS: cannot change directory:/home/xxx 500 OOPS: child died
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- 跟我一起写 Makefile(八)
六.多行变量 还有一种设置变量值的方法是使用define关键字.使用define关键字设置变量的值可以有换行,这有利于定义一系列的命令(前面我们讲过"命令包"的技术就是利用这个 ...
- shell脚本——awk
目录 一.awk 1.1.awk简介 1.2.基本格式 1.3.工作原理 1.4.常见的内建变量(可直接用) 按字段输出文本 1.5.awk和getline 有重定向符 无重定向符 1.6.指定分隔符 ...
- STP生成树的一些笔记
一.STP概述 1.1.STP简介 交换网络环路主要由广播风暴.多帧复制和MAC地址表紊乱造成. 广播风暴:一个数据帧或包被传输到本地网段 (由广播域定义)上的每个节点就是广播:由于网络拓扑的设计和连 ...
- Python实现AI图像识别-身份证识别
图像识别说白了就是把一张照片上面的文字进行提取,提供工作效率 需求分析 身份证识别主要是把一张身份证照片上面的文字信息进行提取,不用再使用人工去手动抄写了,下面给大家说的这个身份识别主要是使用pyth ...