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

相关文章
|
3天前
|
Web App开发 IDE 测试技术
深入理解自动化测试框架Selenium的设计与实践
【4月更文挑战第27天】在软件开发周期中,确保代码质量和功能正确性至关重要。随着敏捷开发的普及和持续集成/持续部署(CI/CD)的实践,自动化测试已成为现代开发工作流程的核心部分。本文将探讨一个广泛使用的开源自动化测试工具——Selenium,并剖析其设计原理、架构以及在实际中的应用。我们将通过具体案例分析,展示如何有效利用Selenium进行跨浏览器测试,并讨论在真实环境中可能遇到的挑战及解决方案。
|
5天前
|
数据采集 前端开发 测试技术
《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)
【4月更文挑战第23天】本文介绍了网页中的滑动验证码的实现原理和自动化测试方法。作者首先提到了网站的反爬虫机制,并表示在本地创建一个没有该机制的网页,然后使用谷歌浏览器进行验证。接着,文章详细讲解了如何使用WebElement的click()方法以及Action类提供的API来模拟鼠标的各种操作,如右击、双击、悬停和拖动。
8 2
|
5天前
|
Java 测试技术 持续交付
深入理解与应用Selenium WebDriver进行自动化测试
【4月更文挑战第25天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加速市场发布的关键步骤。Selenium WebDriver作为业界广泛采用的自动化测试工具之一,提供了一种灵活且高效的方式来模拟用户与Web应用程序交互。本文将探讨Selenium WebDriver的核心概念、架构以及实际应用中的技巧和最佳实践。通过深入分析其工作原理及常见问题解决方案,旨在帮助测试工程师提升测试效率,确保测试结果的准确性和可靠性。
|
6天前
|
Web App开发 数据采集 Java
《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)
【4月更文挑战第22天】本文介绍了在测试过程中可能会用到的两个功能:Actions类中的拖拽操作和划取字段操作。拖拽操作包括基本讲解、项目实战、代码设计和参考代码,涉及到鼠标按住元素并将其拖动到另一个元素上或指定位置。划取字段操作则介绍了如何在一段文字中随机选取一部分,包括项目实战、代码设计和参考代码。此外,文章还提到了滑动验证的实现,并提供了相关的代码示例。
32 2
|
8天前
|
前端开发 测试技术 C++
Python自动化测试面试:unittest、pytest与Selenium详解
【4月更文挑战第19天】本文聚焦Python自动化测试面试,重点讨论unittest、pytest和Selenium三大框架。unittest涉及断言、TestSuite和覆盖率报告;易错点包括测试代码冗余和异常处理。pytest涵盖fixtures、参数化测试和插件系统,要注意避免过度依赖unittest特性。Selenium的核心是WebDriver操作、等待策略和测试报告生成,强调智能等待和元素定位策略。掌握这些关键点将有助于提升面试表现。
22 0
|
10天前
|
Web App开发 JavaScript 前端开发
深入理解自动化测试框架Selenium的设计与实现
【4月更文挑战第20天】 在软件测试领域,自动化测试已成为提升测试效率和确保产品质量的关键手段。Selenium作为一款广泛使用的开源自动化测试框架,其设计精巧且功能强大,为Web应用提供了一种灵活、高效的测试解决方案。本文将深入探讨Selenium的核心架构与实现细节,解析其如何通过模拟用户操作来执行测试用例,以及它如何适应不断变化的Web技术标准。通过对Selenium内部机制的剖析,旨在帮助测试工程师更好地掌握该工具,并在测试实践中发挥其最大效能。
|
11天前
|
前端开发 JavaScript Java
《手把手教你》系列技巧篇(二十五)-java+ selenium自动化测试-FluentWait(详细教程)
【4月更文挑战第17天】其实今天介绍也讲解的也是一种等待的方法,有些童鞋或者小伙伴们会问宏哥,这也是一种等待方法,为什么不在上一篇文章中竹筒倒豆子一股脑的全部说完,反而又在这里单独写了一篇。那是因为这个比较重要,所以宏哥专门为她量身定制了一篇。FluentWait是Selenium中功能强大的一种等待方式,翻译成中文是流畅等待的意思。在介绍FluentWait之前,我们来讨论下为什么需要设置等待,我们前面介绍了隐式等待和显式等待。
35 3
|
21天前
|
测试技术 C语言
网站压力测试工具Siege图文详解
网站压力测试工具Siege图文详解
27 0
|
1月前
|
JavaScript jenkins 测试技术
这10款性能测试工具,收藏起来,测试人的工具箱!
这10款性能测试工具,收藏起来,测试人的工具箱!
|
1月前
|
测试技术
现代软件测试中的自动化工具与挑战
传统软件测试面临着越来越复杂的系统架构和不断增长的测试需求,自动化测试工具应运而生。本文将探讨现代软件测试中自动化工具的应用和挑战,深入分析其优势与局限性,为软件测试领域的发展提供思路和启示。