《手把手教你》系列技巧篇(二十七)-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
北京-宏哥: 在Playwright中,slow_mo参数主要用于控制操作之间的延迟,以便于观察或调试。 在您提到的情况下,即使将slow_mo设置为100,启动Firefox的时间仍然是9秒,这表明slow_mo参数并没有对启动时间产生显著影响。这可能是因为启动时间主要受其他因素影响,比如浏览器的初始化过程、系统资源的使用情况等。 要解决启动时间问题,可以尝试以下几个方法: 优化启动配置:检查是否有不必要的浏览器启动参数,或者是否可以通过调整浏览器的启动配置来加快启动速度。 检查系统资源:确保系统资源充足,没有其他大量消耗资源的进程在运行。 更新Playwright和浏览器:确保Playwright和浏览器都是最新版本,有时候新版本会修复一些性能问题。 考虑使用其他浏览器:如果Firefox的启动速度一直不能满足需求,可以考虑使用其他浏览器,比如Chrome或Edge,看是否会有所改善。 此外,如果启动Firefox时遇到了特定的问题,比如防火墙设置、网络配置等,也可能影响启动时间。确保这些设置是正确的,也可以帮助提升启动速度。例如,如果防火墙设置不当,可能会导致浏览器加载速度变慢。在这种情况下,可以通过调整防火墙设置或者将浏览器添加到防火墙的白名单中来解决。 总的来说,虽然slow_mo参数主要用于调试目的,但它并不直接影响浏览器的启动时间。解决启动时间问题可能需要从其他方面入手,比如优化启动配置、检查系统资源、更新软件版本等。
朤月龘龖: 新手小白发问,后端监视器,上面图片和下面的解释怎么对应不起来啊,那个英文不一样呢?意思是一样的吗?
SpiderAiDavid: 宏哥,请教下: browser = p.firefox.launch(headless=False, slow_mo=100) 在window下启动火狐需要9s, slow_mo去掉也是9s, 有解决思路吗?
北京-宏哥: 有啊,有激活工具,自己用工具获取注册码
画中有画: 北京宏哥公众号上根本就没有charles注册码