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

简介: 【4月更文挑战第14天】本文介绍了在Web自动化测试中如何使用Selenium进行浏览器窗口的切换。首先,获取浏览器窗口句柄有两种方式:获取所有窗口句柄的集合和获取当前窗口句柄。然后,通过`switchTo().window()`方法切换到目标窗口。在项目实战部分,展示了如何在京东网站上实现页面间的切换,包括点击手机链接打开新窗口,然后切换到新窗口并点击小米链接。文章还提供了两种不同的代码实现方式,并给出了运行代码后的控制台输出和浏览器动作演示。最后,作者建议将窗口切换的逻辑封装成方法以提高代码复用性。

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

我们先来看一个实例,在京东首页,点击手机,会在新的页面显示手机通讯的页面,在手机页面点击小米,会在新的窗口打开显示小米手机的页面。这个过程,刚好是页面A到页面B再到页面C。我们先抛开其他的,就是先实现driver在页面A切换到页面B,然后切换到页面C这个过程如何实现,在webdriver中提供了一个switch.to.window(handle)的方法。参数handle就是前面文章中提到的获取窗口句柄的值。

4.1代码设计

4.2参考代码

package lessons;


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 = new ChromeDriver();


       driver.manage().window().maximize();


       driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);


       driver.get("https://www.jd.com/");


       Thread.sleep(1000);


       //点击京东左侧菜单中的 手机

       WebElement phone_link = driver.findElement(By.linkText("手机"));

       phone_link.click();

       Thread.sleep(1000);


       //切换至新窗口

       //首先,我们要先获取到一个主句柄,作为灯塔,防止"迷路"

       String nowhandle = driver.getWindowHandle();

       

       //接着我们要获取所有的句柄信息,并赋值给 handles

       //String[] handles=new String[driver.getWindowHandles().size()];

       Set<String> handles = driver.getWindowHandles();

       System.out.println("切换前的title:"+driver.getTitle());

       //使用for循环,遍历所有的handles,以便判断

       for (String handle:handles){

           if(handle!=nowhandle)

               driver.switchTo().window(handle);

       }

       //让我们打印一下切换后窗口的 title

       System.out.println("切换后的title:"+driver.getTitle());

       WebElement xiaomi_link = driver.findElement(By.linkText("小米"));

       xiaomi_link.click();

       Thread.sleep(1000);

   }

}

4.3.运行代码

1.运行代码,右键Run AS->java Application,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

上面在获取handles过程写了一个for循环,for循环的句柄和当前driver的句柄不相等,那么就调用切换窗口的方法,切换到第二个窗口,然后开始操作第二个窗口的元素,如果没有切换这一步骤,就操作第二个窗口的元素,则会报错找不到元素。其实除了这一种方法,还有其他的方法。例如:获取handles过程写了一个for循环,for循环的句柄和当前driver的句柄相等,那么就continue,也就是结束单循环,什么也不做。如果不是,那么就调用切换窗口的方法,切换到第二个窗口。

4.4方法二

4.4.1参考代码

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 = new ChromeDriver();


       driver.manage().window().maximize();


       driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);


       driver.get("https://www.jd.com/");


       Thread.sleep(1000);


       //点击京东左侧菜单中的 手机

       WebElement phone_link = driver.findElement(By.linkText("手机"));

       phone_link.click();

       Thread.sleep(1000);


       // 获取当前页面句柄

       String handle = driver.getWindowHandle();

       // 获取所有页面的句柄,并循环判断不是当前的句柄

       for (String handles : driver.getWindowHandles()) {

           if (handles.equals(handle))

               continue;

           driver.switchTo().window(handles);

       }


       WebElement xiaomi_link = driver.findElement(By.linkText("小米"));

       xiaomi_link.click();

       Thread.sleep(1000);

   }

}

5.项目实战2

  可能有人就会提出,如果我需要第二个切换到第三个呢,假如说,在判断第三个句柄不等于第二个,那么driver会不会默认切换到第三个窗口还是切换到第一个呢。如果真要这么做,需要用到ArrayList,然后用到迭代,可能稍微变得复杂。为了避免这种复杂情况出现,我推荐这样做,只需要把上面代码中的continue语句改成driver.close(),前面文章介绍过,close是关闭当前页面。如果是页面A点击链接打开页面B,那么这个过程关闭的就是页面A,同时把driver切换到页面B。如果有第三个,从第二个页面到第三个页面也是用这样切换方法。这里永远就两个页面之间处理的关系。一般来说,自动化也是尽量在一个页面做完相关测试,才会切换到其他页面。

5.1代码设计

5.2参考代码

package lessons;


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 = new ChromeDriver();


       driver.manage().window().maximize();


       driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);


       driver.get("https://www.jd.com/");


       Thread.sleep(1000);


       //点击京东左侧菜单中的 手机

       WebElement phone_link = driver.findElement(By.linkText("手机"));

       phone_link.click();

       Thread.sleep(1000);


       // 获取当前页面句柄

       String handle = driver.getWindowHandle();

       // 获取所有页面的句柄,并循环判断不是当前的句柄

       for (String temphandle : driver.getWindowHandles()) {

           if (!temphandle.equals(handle))

               driver.close();

           driver.switchTo().window(temphandle);

       }


       WebElement xiaomi_link = driver.findElement(By.linkText("小米"));

       xiaomi_link.click();

       Thread.sleep(1000);

   }

}

5.3运行代码

1.运行代码,右键Run AS->java Application,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

上面实现了页面A,切换到页面B,同时关闭页面A,页面B点击触发页面C,这个过程还需要用for循环判断一次。所以关于这块,宏哥建议你单独写成一个方法,例如静态方法,直接调用这个,就代码看起来很舒服。关于这个,在下卷中宏哥会介绍的,当然了在框架设计中如果用到的话也会封装一个方法进行调用。

6.小结

好了,今天关于窗口切换就分享到这里,感谢你耐心的阅读。


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

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

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

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

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

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

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

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

Pycharm工具基础使用教程

相关文章
|
19天前
|
Web App开发 Java 测试技术
《手把手教你》系列基础篇之(三)-java+ selenium自动化测试- 启动三大浏览器(上)(详细教程)
【2月更文挑战第12天】《手把手教你》系列基础篇之(三)-java+ selenium自动化测试- 启动三大浏览器(上)(详细教程) 前边宏哥已经将环境搭建好了,今天就在Java项目搭建环境中简单地实践一下: 启动三大浏览器。按市场份额来说,全球前三大浏览器是:IE.Firefox.Chrome。因此宏哥这里主要介绍一下如何启动这三大浏览器即可,其他浏览器类似的方法,照猫画虎就可以了。
54 1
|
19天前
|
Web App开发 前端开发 Java
《手把手教你》系列技巧篇(九)-java+ selenium自动化测试-元素定位大法之By name(详细教程)
【4月更文挑战第1天】 这篇教程介绍了如何使用Selenium Webdriver通过name属性来定位网页元素,作为系列教程的一部分,之前讲解了id定位,后续还会有其他六种定位方法。文中以百度搜索为例,详细说明了定位搜索框(name=&quot;wd&quot;)并输入关键词“北京宏哥”的步骤,包括手动操作流程、编写自动化脚本以及代码实现。此外,还提供了查看和理解Selenium源码的方法,强调了`open implementation`选项用于查看方法的具体实现。整个过程旨在帮助读者学习Selenium的元素定位,并实践自动化测试。
54 0
|
19天前
|
Web App开发 存储 JavaScript
《手把手教你》系列技巧篇(八)-java+ selenium自动化测试-元素定位大法之By id(详细教程)
【2月更文挑战第17天】本文介绍了Web自动化测试的核心——元素定位。文章首先强调了定位元素的重要性,指出找不到元素则无法进行后续操作。Selenium提供八种定位方法,包括By id、name、class name等。其中,By id是最简单快捷的方式。文章还阐述了自动化测试的步骤:定位元素、操作元素、验证结果和记录测试结果。此外,讨论了如何选择定位方法,推荐优先使用简单稳定的方式,如id,其次考虑其他方法。最后,作者提供了Chrome浏览器的开发者工具作为定位元素的工具,并给出了通过id定位的代码示例。
66 0
|
19天前
|
XML Java 测试技术
《手把手教你》系列技巧篇(十五)-java+ selenium自动化测试-元素定位大法之By xpath中卷(详细教程)
【4月更文挑战第7天】按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath。xpath 的定位方法, 非常强大。使用这种方法几乎可以定位到页面上的任意元素。xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面,所以我们可以使用Xpath 的用法来定位页面元素。XPath 是XML 和Path的缩写,主要用于xml文档中选择文档中节点。基于XML树状文档结构,XPath语言可以用在整棵树中寻找指定的节点。
57 5
|
19天前
|
XML 前端开发 Java
《手把手教你》系列技巧篇(十四)-java+ selenium自动化测试-元素定位大法之By xpath上卷(详细教程)
【4月更文挑战第6天】按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath。xpath 的定位方法, 非常强大。使用这种方法几乎可以定位到页面上的任意元素。xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面,所以我们可以使用Xpath 的用法来定位页面元素。XPath 是XML 和Path的缩写,主要用于xml文档中选择文档中节点。基于XML树状文档结构,XPath语言可以用在整棵树中寻找指定的节点。
53 0
|
15天前
|
JavaScript 前端开发 Java
《手把手教你》系列技巧篇(四十九)-java+ selenium自动化测试-隐藏元素定位与操作(详解教程)
【5月更文挑战第13天】本文主要讨论了在Selenium自动化测试中如何处理前端隐藏元素的问题。隐藏元素通常是通过`type="hidden"`或`style="display: none;"`属性实现的,它们在页面上不可见,但仍然存在于HTML代码中。Selenium可以定位到这些隐藏元素,但无法直接进行点击、输入等操作,会报错“ElementNotInteractableException”。
40 3
|
12天前
|
JavaScript 前端开发 Java
《手把手教你》系列技巧篇(五十二)-java+ selenium自动化测试-处理面包屑(详细教程)
【5月更文挑战第16天】本文介绍了网页面包屑导航的概念、作用及其实现方式。面包屑导航是一种用户界面元素,帮助用户理解他们在网站中的位置并方便返回。通常形式为“首页>分类>子分类>内容页”,最多三层结构。在自动化测试中,处理面包屑涉及获取层级关系和当前层级,可以通过查找包含面包屑的div或ul元素,再提取其中的链接来实现。文中还提供了一个基于HTML和JavaScript的简单示例,并展示了相应的自动化测试代码设计和运行结果。
20 0
|
18天前
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(四十六)-java+ selenium自动化测试-web页面定位toast-下篇(详解教程)
【5月更文挑战第10天】本文介绍了使用Java和Selenium进行Web自动化测试的实践,以安居客网站为例。最后,提到了在浏览器开发者工具中调试和观察页面元素的方法。
29 2
|
18天前
|
Web App开发 JavaScript 测试技术
《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)
【5月更文挑战第9天】本文介绍了在Appium中处理App自动化测试中遇到的Toast元素定位的方法。Toast在Web UI测试中也常见,通常作为轻量级反馈短暂显示。文章提供了两种定位Toast元素的技巧.
21 0
|
19天前
|
Java 测试技术 定位技术
《手把手教你》系列技巧篇(二十三)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换下卷(详细教程)
【4月更文挑战第15天】本文介绍了如何使用Selenium进行浏览器窗口切换以操作不同页面元素。首先,获取浏览器窗口句柄有两种方法:获取所有窗口句柄的集合和获取当前窗口句柄。然后,通过`switchTo().window()`方法切换到目标窗口句柄。在项目实战部分,给出了一个示例,展示了在百度首页、新闻页面和地图页面之间切换并输入文字的操作。最后,文章还探讨了在某些情况下可能出现的问题,并提供了一个简单的本地HTML页面示例来演示窗口切换的正确操作。
61 0