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

    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();时候只有百度首页关闭了,其他页面不受影响,不相信的小伙伴们可以在第一个或者第二个页面定位到页面的元素进行操作,代码会报错告诉你找不到页面元素。所以要想操作对应页面的元素,我们就需要切换到对应窗口的句柄即可。

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

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



        感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
        如果您觉得阅读本文对您有帮助,请点一下左下角“推荐”按钮,您的将是我最大的写作动力!另外您也可以选择关注我,可以很方便找到我!
        本文版权归作者和博客园共有,来源网址:https://www.cnblogs.com/du-hong 欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!
    个人微信公众号 个人微信
  • 相关阅读:
    BZOJ5473: 仙人掌
    BZOJ5289: [Hnoi2018]排列
    BZOJ5322: [JXOI2018]排序问题
    BZOJ5323:[JXOI2018]游戏
    webstorm引用ESLint进行静态代码检查
    React基础知识
    静态资源优化方案
    Nodejs 饭店
    linux du和df
    Docker知识-1
  • 原文地址:https://www.cnblogs.com/du-hong/p/15157376.html
Copyright © 2011-2022 走看看