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

相关文章
|
1天前
|
JavaScript 前端开发 测试技术
《手把手教你》系列技巧篇(四十八)-java+ selenium自动化测试-判断元素是否可操作(详解教程)
【5月更文挑战第12天】本文介绍了WebDriver中用于判断元素状态的三个方法:`isEnabled()`、`isSelected()`和`isDisplayed()`。`isSelected()`检查元素是否被选中,通常用于勾选框。`isDisplayed()`则用来判断元素是否在页面上可见。`isEnabled()`方法确定元素是否可操作,例如是否能点击或输入内容。
11 1
|
2天前
|
存储 JavaScript Java
《手把手教你》系列技巧篇(四十七)-java+ selenium自动化测试-判断元素是否显示(详解教程)
【5月更文挑战第11天】WebDriver 的 `isDisplayed()` 方法用于检查页面元素是否可见,如果元素存在于DOM中且可视,返回`true`,否则返回`false`。在自动化测试中,这个方法常用于验证元素是否真正显示在页面上。示例代码展示了如何使用 `isDisplayed()` 判断百度登录页面的特定错误提示文字是否出现。
12 1
|
3天前
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(四十六)-java+ selenium自动化测试-web页面定位toast-下篇(详解教程)
【5月更文挑战第10天】本文介绍了使用Java和Selenium进行Web自动化测试的实践,以安居客网站为例。最后,提到了在浏览器开发者工具中调试和观察页面元素的方法。
13 2
|
3天前
|
敏捷开发 测试技术 持续交付
深入理解自动化测试框架:以Selenium为例
【5月更文挑战第16天】 随着软件行业的迅猛发展,质量保障变得愈加重要。自动化测试作为确保软件质量的重要环节,其效率和可靠性受到了广泛关注。本文旨在深入探讨自动化测试框架的构建与优化,特别是以Selenium框架为例,分析其在实际应用中的优势、常见问题以及解决方案。通过具体案例分析,揭示如何提高自动化测试的稳定性和灵活性,从而更好地服务于敏捷开发和持续集成流程。
20 5
|
4天前
|
Web App开发 JavaScript 测试技术
《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)
【5月更文挑战第9天】本文介绍了在Appium中处理App自动化测试中遇到的Toast元素定位的方法。Toast在Web UI测试中也常见,通常作为轻量级反馈短暂显示。文章提供了两种定位Toast元素的技巧.
11 0
|
3天前
|
Java 测试技术
Java多线程的一些基本例子
【5月更文挑战第17天】Java多线程允许并发执行任务。示例1展示创建并启动两个`MyThread`对象,各自独立打印&quot;Hello World&quot;。示例2的`CounterExample`中,两个线程(IncrementThread和DecrementThread)同步地增加和减少共享计数器,确保最终计数为零。这些例子展示了Java线程的基本用法,包括线程同步,还有如Executor框架和线程池等更复杂的用例。
10 0
|
3天前
|
缓存 安全 Java
7张图带你轻松理解Java 线程安全,java缓存机制面试
7张图带你轻松理解Java 线程安全,java缓存机制面试
|
1天前
|
Java
Java一分钟之-并发编程:线程间通信(Phaser, CyclicBarrier, Semaphore)
【5月更文挑战第19天】Java并发编程中,Phaser、CyclicBarrier和Semaphore是三种强大的同步工具。Phaser用于阶段性任务协调,支持动态注册;CyclicBarrier允许线程同步执行,适合循环任务;Semaphore控制资源访问线程数,常用于限流和资源池管理。了解其使用场景、常见问题及避免策略,结合代码示例,能有效提升并发程序效率。注意异常处理和资源管理,以防止并发问题。
19 2
|
1天前
|
安全 Java 容器
Java一分钟之-并发编程:线程安全的集合类
【5月更文挑战第19天】Java提供线程安全集合类以解决并发环境中的数据一致性问题。例如,Vector是线程安全但效率低;可以使用Collections.synchronizedXxx将ArrayList或HashMap同步;ConcurrentHashMap是高效线程安全的映射;CopyOnWriteArrayList和CopyOnWriteArraySet适合读多写少场景;LinkedBlockingQueue是生产者-消费者模型中的线程安全队列。注意,过度同步可能影响性能,应尽量减少共享状态并利用并发工具类。
15 2
http://www.vxiaotou.com