《手把手教你》系列技巧篇(二十一)-java+ selenium自动化测试-浏览器窗口的句柄(详细教程)

简介: 【4月更文挑战第13天】本文介绍了如何获取浏览器窗口句柄,句柄是标识浏览器窗口的唯一ID。文章首先解释了窗口句柄的概念,然后通过Java代码示例展示了在单个、多个窗口句柄情况下的操作,包括打印单个窗口句柄和获取所有窗口句柄的方法。在多窗口句柄的场景中,代码演示了如何在不同标签页之间切换。最后,文章强调了句柄在实际操作中的重要性,特别是在处理多个窗口时。

1.简介

  今天本来就要分享和讲解三大延时等待的,但是在写作过程中发了问题,会用到这一个知识点,于是就提前介绍一下,以便后边用到了可以更好的理解和掌握。本文就是要介绍如何获得浏览器窗体的句柄或者叫编号,为后面的driver实例在多个窗体之间切换做准备。

2.什么是浏览器窗口句柄?

先来解释下什么是句柄,有时候浏览器的窗口句柄,也叫windows id,英文单词更好理解。你打开了一个浏览器,你开一个tab,就生成了一个id,这个id直到你关闭这个tab才会消失。如果你在一个浏览器上打开多个tab,那么就有多个windows id,为什么你关闭其中一个tab,但是不影响其他tab的显示,就是这个id的作用。

3.实战

废话不说 ,直接进入主题进行实例讲解。

3.1一个windows句柄

我们先看看浏览器只开一个tab,也就是只有一个windows句柄的时候,打印出这个句柄出来。

3.1.1代码设计

3.1.2参考代码

package lessons;


import java.util.concurrent.TimeUnit;


import org.openqa.selenium.WebDriver;

import org.openqa.selenium.chrome.ChromeDriver;


/**

* @author 北京-宏哥

*

* 2021年8月19日

*/

public class GetWinId {

   

   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.get("http://wwww.baidu.com");

       

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

       

       Thread.sleep(1000);

       //打印当前页面句柄

       System.out.println("打印结果"+driver.getWindowHandle());    

       

       driver.close();

   }

}

3.1.3运行代码

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

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

3.2两个windows句柄

接下来,看看有两个tab,打印出两个windows句柄来,使用getWindowsHandles()方法。

3.2.1代码设计

3.2.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 北京-宏哥

*

* 2021年8月19日

*/

public class GetWinId {

   

   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.get("http://wwww.baidu.com");

       

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

       

       Thread.sleep(1000);

       

       WebElement News  = driver.findElement(By.xpath("//div/a[text()='新闻']"));

       

       News.click();

       

       Thread.sleep(1000);

       

       //打印当前页面句柄

       System.out.println("打印结果"+driver.getWindowHandles());    

       

       driver.close();

   }

}

3.2.3运行代码

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

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

3.3大于两个windows句柄

接下来,看看大于两个tab,打印出大于两个windows句柄来,使用getWindowsHandles()方法。

3.3.1代码设计

3.3.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 北京-宏哥

*

* 2021年8月19日

*/

public class GetWinId {

   

   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.get("http://wwww.baidu.com");

       

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

       

       Thread.sleep(1000);

       //打开新闻页面

       WebElement News = driver.findElement(By.xpath("//div/a[text()='新闻']"));

       

       News.click();

       

       Thread.sleep(1000);

       //打开地图页面

       WebElement Map = driver.findElement(By.xpath("//div/a[text()='地图']"));

       

       Map.click();

       

       Thread.sleep(1000);

       //打印当前页面句柄

       System.out.println("打印结果"+driver.getWindowHandles());    

       

       driver.close();

   }

}

3.3.3运行代码

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

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

4.小结

在实际操作中,细心的小伙伴们或者童鞋们已经发现代码的逻辑一直都在百度首页,也就是第一个打开的页面,所以在执行driver.close();时候只有百度首页关闭了,其他页面不受影响,不相信的小伙伴们可以在第一个或者第二个页面定位到页面的元素进行操作,代码会报错告诉你找不到页面元素。所以要想操作对应页面的元素,我们就需要切换到对应窗口的句柄即可。

宏哥在后边的实操中在断言时候,就遇到相同的问题,需要进行句柄切换进行断言,这个宏哥可能会单独列一篇文章进行讲解和分享的。

好了,今天时间也不早了,感谢你耐心地阅读。早点休息吧!


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

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

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

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

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

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

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

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

Pycharm工具基础使用教程

相关文章
|
4月前
|
数据采集 前端开发 JavaScript
深挖navigator.webdriver浏览器自动化检测的底层分析
本文详细讲解了如何通过技术手段破解浏览器 `navigator.webdriver` 检测,结合爬虫代理、多线程等策略,在豆瓣图书页面批量采集数据。具体包括:隐藏 Selenium 特征、配置代理突破 IP 限制、设置伪装用户、利用多线程提升效率。文章面向初学者,提供分步教程与示例代码,同时设有「陷阱警告」帮助规避常见问题。目标是从底层实现反检测,高效采集图书评分、简介、作者等信息,适合具备 Python 和 Selenium 基础的读者实践学习。
161 12
深挖navigator.webdriver浏览器自动化检测的底层分析
|
11月前
|
Web App开发 前端开发 JavaScript
探索Python科学计算的边界:利用Selenium进行Web应用性能测试与优化
【10月更文挑战第6天】随着互联网技术的发展,Web应用程序已经成为人们日常生活和工作中不可或缺的一部分。这些应用不仅需要提供丰富的功能,还必须具备良好的性能表现以保证用户体验。性能测试是确保Web应用能够快速响应用户请求并处理大量并发访问的关键步骤之一。本文将探讨如何使用Python结合Selenium来进行Web应用的性能测试,并通过实际代码示例展示如何识别瓶颈及优化应用。
457 5
|
5月前
|
数据采集 JavaScript 前端开发
浏览器自动化检测对抗:修改navigator.webdriver属性的底层实现
本文介绍了如何构建一个反检测爬虫以爬取Amazon商品信息。通过使用`undetected-chromedriver`规避自动化检测,修改`navigator.webdriver`属性隐藏痕迹,并结合代理、Cookie和User-Agent技术,实现稳定的数据采集。代码包含浏览器配置、无痕设置、关键词搜索及数据提取等功能,同时提供常见问题解决方法,助你高效应对反爬策略。
430 1
|
8月前
|
Web App开发 人工智能 JSON
AutoMouser:AI Chrome扩展程序,实时跟踪用户的浏览器操作,自动生成自动化操作脚本
AutoMouser是一款Chrome扩展程序,能够实时跟踪用户交互行为,并基于OpenAI的GPT模型自动生成Selenium测试代码,简化自动化测试流程。
499 17
AutoMouser:AI Chrome扩展程序,实时跟踪用户的浏览器操作,自动生成自动化操作脚本
|
9月前
|
Web App开发 IDE JavaScript
Selenium IDE:Web自动化测试的得力助手
Selenium IDE:Web自动化测试的利器。作为开源工具,Selenium IDE支持录制与回放用户操作,适用于Chrome、Firefox等多浏览器,简化了测试流程,提升了效率,降低了自动化测试的门槛。它还支持导出多种编程语言的脚本,便于测试集成与复用。
264 31
Selenium IDE:Web自动化测试的得力助手
|
8月前
|
Web App开发 数据采集 JavaScript
Chrome浏览器实例的TypeScript自动化脚本
Chrome浏览器实例的TypeScript自动化脚本
|
11月前
|
Java 测试技术 C#
自动化测试之美:从Selenium到Appium
【10月更文挑战第3天】在软件开发的海洋中,自动化测试如同一艘航船,引领着质量保证的方向。本文将带你领略自动化测试的魅力,从Web端的Selenium到移动端的Appium,我们将一探究竟,看看这些工具如何帮助我们高效地进行软件测试。你将了解到,自动化测试不仅仅是技术的展示,更是一种提升开发效率和产品质量的智慧选择。让我们一起启航,探索自动化测试的世界!
|
11月前
|
XML Java Maven
在 Cucumber 测试中自动将 Cucumber 数据表映射到 Java 对象
在 Cucumber 测试中自动将 Cucumber 数据表映射到 Java 对象
201 7
|
11月前
|
JavaScript 前端开发 测试技术
精通Selenium:从基础到高级的网页自动化测试策略
【10月更文挑战第6天】随着Web应用变得越来越复杂,手动进行功能和兼容性测试变得既耗时又容易出错。自动化测试因此成为了现代软件开发不可或缺的一部分。Selenium是一个强大的工具集,它支持多种编程语言(包括Python),允许开发者编写脚本来模拟用户与Web页面的交互。本文将带领读者从Selenium的基础知识出发,逐步深入到高级的应用场景,通过丰富的代码示例来展示如何高效地进行网页自动化测试。
1724 5
|
11月前
|
Web App开发 缓存 Linux
高效Selenium测试技巧:轻松控制已开启的浏览器
【10月更文挑战第13天】在进行Selenium测试时,通常会启动新浏览器实例,但有时需要控制已开启的浏览器,以节省时间并更真实地模拟用户行为。这可通过设置Chrome为可远程控制并使用`Remote WebDriver`连接实现。需在启动Chrome时添加`--remote-debugging-port`参数,并通过Python脚本中的`webdriver.Remote`连接至指定端口。此外,还可利用会话ID(Session ID)重新连接浏览器,提高测试灵活性。需要注意浏览器版本兼容性及元素定位稳定性等问题,确保测试准确性和一致性。
889 1