《手把手教你》系列技巧篇(二十三)-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工具基础使用教程

相关文章
|
6月前
|
Java 关系型数据库 数据库
Java 项目实战教程从基础到进阶实战案例分析详解
本文介绍了多个Java项目实战案例,涵盖企业级管理系统、电商平台、在线书店及新手小项目,结合Spring Boot、Spring Cloud、MyBatis等主流技术,通过实际应用场景帮助开发者掌握Java项目开发的核心技能,适合从基础到进阶的学习与实践。
968 3
|
6月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
599 0
|
5月前
|
安全 Java
Java之泛型使用教程
Java之泛型使用教程
409 10
|
4月前
|
Oracle Java 关系型数据库
Java 简单教程
Java是跨平台、面向对象的编程语言,广泛用于企业开发、Android应用等。本教程涵盖环境搭建、基础语法、流程控制、面向对象、集合与异常处理,助你快速入门并编写简单程序,为进一步深入学习打下坚实基础。
410 0
|
7月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
246 0
|
7月前
|
人工智能 Java 测试技术
Java or Python?测试开发工程师如何选择合适的编程语言?
测试工程师如何选择编程语言?Java 还是 Python?多位资深专家分享建议:Python 入门简单、开发效率高,适合新手及自动化测试;Java 生态成熟,适合大型项目和平台开发。建议结合公司技术栈、个人基础及发展方向选择。长远来看,两者兼通更佳,同时关注 Go 等新兴语言。快速学习与实践才是关键。
|
Web App开发 前端开发 JavaScript
探索Python科学计算的边界:利用Selenium进行Web应用性能测试与优化
【10月更文挑战第6天】随着互联网技术的发展,Web应用程序已经成为人们日常生活和工作中不可或缺的一部分。这些应用不仅需要提供丰富的功能,还必须具备良好的性能表现以保证用户体验。性能测试是确保Web应用能够快速响应用户请求并处理大量并发访问的关键步骤之一。本文将探讨如何使用Python结合Selenium来进行Web应用的性能测试,并通过实际代码示例展示如何识别瓶颈及优化应用。
632 5
|
Web App开发 IDE JavaScript
Selenium IDE:Web自动化测试的得力助手
Selenium IDE:Web自动化测试的利器。作为开源工具,Selenium IDE支持录制与回放用户操作,适用于Chrome、Firefox等多浏览器,简化了测试流程,提升了效率,降低了自动化测试的门槛。它还支持导出多种编程语言的脚本,便于测试集成与复用。
413 31
Selenium IDE:Web自动化测试的得力助手
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
906 17
Selenium:强大的 Web 自动化测试工具
|
Java 测试技术 C#
自动化测试之美:从Selenium到Appium
【10月更文挑战第3天】在软件开发的海洋中,自动化测试如同一艘航船,引领着质量保证的方向。本文将带你领略自动化测试的魅力,从Web端的Selenium到移动端的Appium,我们将一探究竟,看看这些工具如何帮助我们高效地进行软件测试。你将了解到,自动化测试不仅仅是技术的展示,更是一种提升开发效率和产品质量的智慧选择。让我们一起启航,探索自动化测试的世界!