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