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();时候只有百度首页关闭了,其他页面不受影响,不相信的小伙伴们可以在第一个或者第二个页面定位到页面的元素进行操作,代码会报错告诉你找不到页面元素。所以要想操作对应页面的元素,我们就需要切换到对应窗口的句柄即可。
宏哥在后边的实操中在断言时候,就遇到相同的问题,需要进行句柄切换进行断言,这个宏哥可能会单独列一篇文章进行讲解和分享的。
好了,今天时间也不早了,感谢你耐心地阅读。早点休息吧!