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