如何关闭Selenium中所有已打开的驱动程序?

时间:2017-03-29 10:08:57

标签: java selenium phantomjs selenium-chromedriver

我需要关闭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();

7 个答案:

答案 0 :(得分:1)

您的代码中只有一个WebDriver driver,即使您为其分配了多个ChromeDriver()个对象。因此,您只需使用driver.close()driver.quit();

关闭驱动程序即可

并且只有最新的窗口将被关闭所有以前的窗口仍将保留(现在无法再联系),因为唯一的驱动程序已关闭。

答案 1 :(得分:0)

您是如何初始化驱动程序的?你初始化了多个驱动程序吗?如果是,则分别对所有驱动程序使用quit()方法。否则,只有driver.quit()才有效。

修改

在每次新作业之前使用driver.quit()

答案 2 :(得分:0)

driver.quit()将关闭所有(父+子)浏览器窗口并结束整个会话。这应该可以正常工作。

答案 3 :(得分:0)

首先让我们看看你的代码:

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

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

以下是发生的事情:

  1. 您打开一个新的Chrome实例。
  2. 然后,您可以对该实例执行某些操作:导航到网站。
  3. 下一步,有几件事情发生了:您打开一个新的Chrome实例,然后覆盖引用到您打开的上一个实例。从本质上讲,此时您已经忘记了刚刚打开的第一个浏览器!
  4. 您现在对第二个打开的实例执行某些操作:导航到网站。
  5. 从你的问题来看,目前尚不清楚你究竟想要完成什么。您有几种选择:

    1. 在测试之前打开一个浏览器实例。如果您正在使用,例如JUnit,这通常在@Before方法中完成。
    2. 在测试中做一些工作。
    3. 测试后关闭浏览器。再次在JUnit中,这将在@After方法中完成。
    4. 另一种选择是您可能合法地需要多个浏览器。你需要跟踪所有这些。

      1. 您可以创建List drivers,每次打开新的TextView[] textView = new TextView[3]; for (int cell = 0; cell < 3; cell++){ textView[cell].setText("-"); } 时,都会将其添加到该列表中。
      2. 在测试结束时,迭代该列表,然后关闭所有这些列表。

答案 4 :(得分:0)

我有几个建议给你。

1:命名惯例

在你的帖子中,你说:

  

“...在程序开始时我不知道需要打开多少驱动程序,因此我尝试在循环中打开一些驱动程序名称相同的驱动程序。”

这不是一个非常好的方法,这就是为什么:假设您有两个WebDrivers,每个都名为“driverX”。您需要第一个驱动程序转到“www.google.com”,您需要第二个驱动程序转到“www.yahoo.com”。因此,您的代码如下所示:

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

这成为一个问题,因为您实际上已经将第一个WebDriver从Google重新路由到雅虎,而不是告诉第二个WebDriver转到Yahoo.

这个问题的解决方案是什么?使用唯一名称(例如googleDriveryahooDriver)为每个WebDriver命名。然后,您的代码将如下所示,您不应该有任何冲突:

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

2:WebDriver分组

现在我们已经为每个WebDriver创建了一个唯一的名称,我们可以单独引用它们。这很好,但是,有些应用程序要求我们一次引用其中的几个。这是ArrayLists可以进入的地方。在下面的代码中,我使用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();
    }
}

如果您仍然不理解或有任何疑问,请随时发表评论。

答案 5 :(得分:0)

@AfterMethod
public void tearDown(){

// Your Code

// At the End call

driver.close();

}

答案 6 :(得分:-1)

要扩展Zachary的答案,假设您在测试环境中重新使用驱动程序, 你可以:

  • 在测试类中创建一个arraylist
  • 将您在测试方法中创建的驱动程序添加到此列表中
  • 在所有驱动程序上添加一个@After方法,其中包含for每个循环调用quit() 在测试期间动态添加到arraylist