zoukankan      html  css  js  c++  java
  • 《手把手教你》系列技巧篇(二十七)-java+ selenium自动化测试- quit和close的区别(详解教程)

    1.简介

    尽管有的小伙伴或者童鞋们觉得很简单,不就是关闭退出浏览器,但是宏哥还是把两个方法的区别说一下,不然遇到坑后根本不会想到是这里的问题。

    2.源码

     本文介绍webdriver中关于浏览器退出操作。driver中有两个方法是关于浏览器关闭,一个叫quit,一个叫close。先来看看看两者的声明描述,请看下面声明文档。

      /**
       * Close the current window, quitting the browser if it's the last window currently open.
       * <p>
       * See <a href="https://w3c.github.io/webdriver/#close-window">W3C WebDriver specification</a>
       * for more details.
       */
      void close();
    
      /**
       * Quits this driver, closing every associated window.
       */
      void quit();

    通过查看以上官方声明文档,可以看出close方法是关闭当前窗口,这个当前如何理解?就是driver实例操作的页面,叫当前。如果当前窗口只有一个tab,那么这个close方法就相当于关闭了浏览器。quit方法就是直接退出并关闭所有关联的tab窗口。所以,close方法一般关闭一个tab,quit方法才是我们认为的完全关闭浏览器方法。为了证明这个,宏哥用一个例子去演示一下。

    3.项目实战

    打开度娘,然后打开新闻首页,执行关闭浏览器的操作,看看close和quit的区别。

    3.1代码设计

    3.2参考代码

    package lessons;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    /**
     * @author 北京-宏哥
     * 
     * 《手把手教你》系列技巧篇(二十七)-java+ selenium自动化测试- quit和close的区别(详解教程)
     *
     * 2021年9月14日
     */
    public class CloseQuit {
        
        public static void main(String[] args) throws Exception {
            
            System.setProperty("webdriver.chrome.driver", ".\Tools\chromedriver.exe");
            
            WebDriver driver = new ChromeDriver();
            driver.manage().window().maximize();
            
            driver.get("https://www.baidu.com");
            Thread.sleep(5000);
            //By linkText 查找元素
            driver.findElement(By.partialLinkText("新闻")).click();
            Thread.sleep(1000);
        
            driver.close();
            Thread.sleep(1000);
            driver.quit();
        }
    
    }

    3.3运行代码

    1.运行代码,右键Run AS->java Application,控制台输出,

    close方法在quit方法前边,控制台如下图所示:

    close方法在quit方法后边,控制台如下图所示:

    2.通过打断点给最后两行代码,分别运行,观察这两种方法的实际效果。当代码运行完close方法的时候,由于driver停留在百度首页,所以这个时候关闭了百度首页这个tab,新闻页面并没有关闭。因为新闻页面,driver并没有切换到这个页面,所以不影响。但是当代码运行完quit方法,新闻页面关闭,运行代码后电脑端的浏览器的动作,如下小视频所示:

    3.将最后两行代码顺序调换,打上断点继续运行,可以看到,当代码运行完quit方法后,整个浏览器都直接关闭,close方法都没来得及运行所有浏览器的session ID就都被quit关闭,当运行到close的方法时候,由于quit将所有页面(Session ID)都关闭了,close没有页面(Session ID)关闭而报错:Session ID is null。。运行代码后电脑端的浏览器的动作,如下小视频所示:

    一般来说,我们在自动化测试脚本运行完之后,需要恢复到干净环境,所以,一般都采用driver.quit()来直接关闭浏览器。

    4.小结

    4.1ChromeDriverService

    使用close方法的时候,因为只有百度首页这个tab,所以会关闭浏览器,但是通过查看任务管理器发现,ChromeDriver进程仍存在内存中。如果使用quit方法,整个浏览器都直接关闭,ChromeDriver进程也会被结束。
    ChromeDriver是轻量级的服务,在单任务或不需要频繁启动浏览器的情况下,使用driver.quit()关闭浏览器,可以正常结束ChromeDriver进程。若在一个比较大的 测试套件中频繁的启动关闭,会增加一个比较明显的延时导致浏览器进程不被关闭的情况发生,为了避免这一状况我们可以通过ChromeDriverService来控制ChromeDriver进程的生死,达到用完就关闭的效果避免进程占用情况出现(Running the server in a child process)。具体实现如下:

    ChromeDriverService service = new ChromeDriverService.Builder() .usingChromeDriverExecutable(new File("E:\Selenium WebDriver\chromedriver_win_23.0.1240.0\chromedriver.exe")).usingAnyFreePort().build();
    service.start();
    driver = new ChromeDriver();
    driver.get("http://www.baidu.com");
    driver.quit();
    // 关闭 ChromeDriver 接口
    service.stop();

    4.2close 和 quit区别

    close 和 quit区别:close 只会关闭当前浏览器,而quit不仅会关闭浏览器也会杀掉驱动进程。close的问题在于你多次进行调试时,进程中会残留多个驱动进程,这种情况有可能会引起一些其他的问题,建议使用quit。

    源码分析,close和quit在发送 HttpRequest 请求时,method 都是DELETE ,但uri不同,如下:

     close的HttpRequest

     

     quit 的HttpRequest

     



        感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
        如果您觉得阅读本文对您有帮助,请点一下左下角“推荐”按钮,您的将是我最大的写作动力!另外您也可以选择关注我,可以很方便找到我!
        本文版权归作者和博客园共有,来源网址:https://www.cnblogs.com/du-hong 欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!
    个人微信公众号 个人微信
  • 相关阅读:
    Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)
    博客园博客评论一个奇怪的现象~~这应该不是圣诞礼包
    Asp.Net Web API 2第十五课——Model Validation(模型验证)
    PostgresQL 中有没有rownum这样的,显示结果集的序号
    在postgresqlz中查看与删除索引
    Spring事务异常rollback-only
    spring之Environment
    Spring事务管理——回滚(rollback-for)控制
    类的静态方法无法使用aop拦截
    Spring/SpringBoot定义统一异常错误码返回
  • 原文地址:https://www.cnblogs.com/du-hong/p/15241729.html
Copyright © 2011-2022 走看看