簡體   English   中英

如何關閉Selenium中所有打開的驅動程序?

[英]How to close all opened drivers in Selenium?

我需要關閉Selenium中所有打開的Chrome驅動程序。 我所有的方法都只關閉其中一種。 我需要同時關閉所有驅動程序的原因-在程序開始時,我不知道需要打開多少個驅動程序,因此我嘗試循環打開幾個具有相同驅動程序名稱的驅動程序。

我如何打開這些驅動程序:

WebDriver driver = new ChromeDriver();
driver.get(firstURL);

driver = new ChromeDriver();
driver.get(secondURL);

我如何嘗試關閉兩個驅動程序:

第一次嘗試:

driver.close();

第二次嘗試:

driver.quit();

第三次嘗試:

driver.close();
driver.close();

第四次嘗試:

driver.quit();
driver.quit();

即使您ChromeDriver()分配了多個ChromeDriver()對象,您的代碼中也只有一個WebDriver driver 因此,您可以使用driver.close()driver.quit();關閉驅動程序一次driver.quit();

並且只有最新的窗口將被關閉,因為唯一的驅動程序已關閉,所有先前的窗口仍將保留(現在無法再聯系)。

您如何初始化驅動程序。 您是否初始化了多個驅動程序? 如果是這樣,則對所有驅動程序分別使用quit()方法。 否則,只有driver.quit()應該起作用。

編輯:

在每個新分配之前使用driver.quit()

driver.quit()將關閉所有(父級和子級)瀏覽器窗口並結束整個會話。 這應該工作正常。

首先讓我們看一下您的代碼:

WebDriver driver = new ChromeDriver();
driver.get(firstURL);

driver = new ChromeDriver();
driver.get(secondURL);

這是正在發生的事情:

  1. 您打開一個新的Chrome實例。
  2. 然后,您對該實例執行以下操作:導航到網站。
  3. 下一步,發生了幾件事:打開一個新的Chrome實例,並覆蓋對您打開的上一個實例的引用 從本質上講,這時您已經失去了剛打開的第一個瀏覽器的軌道!
  4. 現在,您使用第二個打開的實例執行操作:導航到網站。

從您的問題出發,目前尚不清楚您到底想完成什么。 您有幾種選擇:

  1. 測試之前,請打開瀏覽器的一個實例。 例如,如果使用的是JUnit,則通常在@Before方法中完成。
  2. 做一些測試工作。
  3. 測試后關閉瀏覽器。 同樣在JUnit中,可以通過@After方法完成此操作。

另一種選擇是您可能合法地需要多個瀏覽器。 您將需要跟蹤所有這些。

  1. 您可以創建一個drivers List ,每次打開一個新drivers時,將其添加到該列表中。
  2. 測試結束時,請遍歷該列表,然后關閉所有列表。

我有幾個建議給你。

1:命名約定

在您的帖子中,您說:

“ ...在程序開始時,我不知道需要打開多少個驅動程序,因此我嘗試循環打開幾個具有相同驅動程序名稱的驅動程序。”

這不是一個很好的方法,這就是原因:假設您有兩個WebDriver,每個都命名為“ driverX”。 您需要第一個驅動程序轉到“ www.google.com ”,並且您需要第二個驅動程序轉到“ www.yahoo.com ”。 因此,您的代碼如下所示:

driverX.get("www.google.com");
driverX.get("www.yahoo.com");

這成為一個問題,因為您實際上沒有將第一個WebDriver從Google重新路由到Yahoo,而是告訴第二個WebDriver去Yahoo。

這個問題有什么解決方案? 使用唯一的名稱(例如googleDriveryahooDriver為每個WebDrivers命名。 然后,您的代碼將如下所示,並且您不應有任何沖突:

googleDriver.get("www.google.com");
yahooDriver.get("www.yahoo.com");

2:WebDriver分組

現在,我們為您的每個WebDriver賦予了唯一的名稱,我們可以分別引用它們。 很好,但是,某些應用程序要求我們一次引用其中的幾個。 這是ArrayList可以進入的地方。在下面的代碼中,我使用了ArrayList來解決您的原始問題。

ArrayList<WebDriver> activeDrivers = new ArrayList<>();
activeDrivers.add(googleDriver);
activeDrivers.add(yahooDriver);

for(WebDriver driver : activeDrivers){
    if(driver.getCurrentUrl().equals("Some predefined exit page"){
       driver.quit();
    }
}

如果您仍然不理解或有任何疑問,請隨時發表評論。

@AfterMethod
public void tearDown(){

// Your Code

// At the End call

driver.close();

}

為了擴展Zachary的答案,假設您在測試環境中使用驅動程序,則可以:

  • 在測試類中創建一個數組列表
  • 將您在測試方法中創建的驅動程序添加到此列表中
  • 在測試期間動態添加到arraylist的所有驅動程序上添加一個@After方法,其中包含一個針對每個循環的quit()循環

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM