《手把手教你》系列技巧篇(二十三)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换下卷(详细教程)

简介: 【4月更文挑战第15天】本文介绍了如何使用Selenium进行浏览器窗口切换以操作不同页面元素。首先,获取浏览器窗口句柄有两种方法:获取所有窗口句柄的集合和获取当前窗口句柄。然后,通过`switchTo().window()`方法切换到目标窗口句柄。在项目实战部分,给出了一个示例,展示了在百度首页、新闻页面和地图页面之间切换并输入文字的操作。最后,文章还探讨了在某些情况下可能出现的问题,并提供了一个简单的本地HTML页面示例来演示窗口切换的正确操作。

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.运行代码后电脑端的浏览器的动作,如下小视频所示:




每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问):

Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

相关文章
|
7月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
660 0
|
8月前
|
Web App开发 存储 前端开发
Python+Selenium自动化爬取携程动态加载游记
Python+Selenium自动化爬取携程动态加载游记
|
12月前
|
缓存 监控 负载均衡
如何提升 API 性能:来自 Java 和测试开发者的优化建议
本文探讨了如何优化API响应时间,提升用户体验。通过缓存(如Redis/Memcached)、减少数据负载(REST过滤字段或GraphQL精确请求)、负载均衡(Nginx/AWS等工具)、数据压缩(Gzip/Brotli)、限流节流、监控性能(Apipost/New Relic等工具)、升级基础设施、减少第三方依赖、优化数据库查询及采用异步处理等方式,可显著提高API速度。快速响应的API不仅让用户满意,还能增强应用整体性能。
|
8月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
263 0
|
8月前
|
人工智能 Java 测试技术
Java or Python?测试开发工程师如何选择合适的编程语言?
测试工程师如何选择编程语言?Java 还是 Python?多位资深专家分享建议:Python 入门简单、开发效率高,适合新手及自动化测试;Java 生态成熟,适合大型项目和平台开发。建议结合公司技术栈、个人基础及发展方向选择。长远来看,两者兼通更佳,同时关注 Go 等新兴语言。快速学习与实践才是关键。
|
Web App开发 数据采集 JavaScript
CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
本文介绍了Selenium、Chrome DevTools及Chrome DevTools Protocol (CDP) 的基本功能与应用。Selenium是一款开源自动化测试工具,适用于网页端应用程序测试和数据采集,具备跨平台特性。Chrome DevTools内置浏览器中,提供调试、分析Web应用程序的功能,包括元素、控制台、源代码和网络选项卡等。CDP是一套用于与Chromium内核浏览器通信的API,支持自动化测试和性能分析。文中还展示了Selenium与CDP结合使用的示例,如捕获网络请求数据和打印网页内容,并推荐了相关书籍和资源以供深入学习。
1774 39
CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
|
5月前
|
数据采集 运维 监控
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
本文系统解析爬虫与自动化核心技术,涵盖HTTP请求、数据解析、分布式架构及反爬策略,结合Scrapy、Selenium等框架实战,助力构建高效、稳定、合规的数据采集系统。
969 62
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
|
6月前
|
运维 Linux 网络安全
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
200 4
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
362 4

热门文章

最新文章