webdriver.Dispose()、. Close()和.Quit()之间的区别


285

这些有什么区别

  1. Webdriver.Close()
  2. Webdriver.Quit()
  3. Webdriver.Dispose()

何时使用哪个?


2
#dispose方法似乎已从WebDriver API中静默删除。更新日志中没有提及,我能找到的最新提及是v2.26 api docs,我再也找不到该链接。
jordanpg

我在下面的答案中看到了混乱的根源。我认为这个问题最初是一个C#问题,因为上述方法(关闭,退出和处理)以大写字母(C#)开头,而不是小写字母(java)。处置尚未从C#WebDriver客户端绑定中删除。
rcasady616 '16

Dispose是一个.Net模式,因此未在Selenium的API文档中进行记录。在RemoteWebDriver中,退出调用Dispose,该命令发送一个退出命令(DELETE / session / {sessionId})。客户端中有几个地方会截获Quit命令。例如,如果FirefoxDriver .net实现无法正常关闭进程,则实际上将执行process.Kill()调用。
塔米尔·丹尼尔

Answers:


244

这是一个很好的问题,我已经看到人们在不应该使用Close()的情况下。我查看了Selenium Client&WebDriver C#绑定的源代码,发现了以下内容。

  1. webDriver.Close() -关闭驱动程序关注的浏览器窗口
  2. webDriver.Quit() -调用Dispose()
  3. webDriver.Dispose() 关闭所有浏览器窗口并安全结束会话

下面的代码将放置驱动程序对象,结束会话并关闭测试期间打开的所有浏览器,无论测试失败还是通过。

public IWebDriver Driver;

[SetUp]
public void SetupTest()
{
    Driver = WebDriverFactory.GetDriver();
}

[TearDown]
public void TearDown()
{
    if (Driver != null)
      Driver.Quit();
}

总而言之,请确保在退出程序之前先调用Quit()或Dispose(),并且除非您确定自己在做什么,否则不要使用Close()方法。

请注意,
当我试图找出一个相关问题为什么我的VM的硬盘空间不足时,我发现了这个问题。原来有一个异常导致每次运行都不调用Quit()或Dispose(),这随后导致appData文件夹填充硬盘驱动器。因此,我们正确使用了Quit()方法,但代码无法访问。摘要确保通过使用异常安全模式或实现IDisposable来确保所有代码路径都会清理非托管对象

同样,
在RemoteDriver调用Quit()或Dispose()的情况下,也会关闭Selenium Server上的会话。如果未关闭会话,则该会话的日志文件将保留在内存中。


您如何更新例外?只是去每个添加一个quit()?
Mark Mayo 2013年

1
在像NUnit,JUnit这样的测试框架中,您只需确保Dispose()在TestTeardown()或TestFixtureTeardown()中即可。在C#中,您可以只使用“ using”语句,如果引发异常,则始终调用Dispose。您可以通过使用try catch最终在Java中执行类似的操作,然后将Dispose放入finally。
rcasady616

1
@ rcasady616这是我得到的最好的解释。谢谢,我认为值得推荐。
RNS

2
@ Mr.Bultitude好,这是可以理解的,考虑到有没有区别^^根据这个答案,Quit()是一个重定向到Dispose()
PixelMaster

1
@PixelMaster,是的,是100%正确的,基本上是重定向。我不是用Selenium编写代码的人,我只能猜测为什么两种方法都出现在C#客户端绑定中。他们可能想保持跨客户端语言“退出”的通用方法,但也想以“使用”语句语法使用驱动程序(witch需要使用Dispose()方法)。这是我最好的猜测,或者是需要清除代码。
rcasady616

47

Close() -用于关闭当前具有焦点的浏览器或页面。

Quit() -用于关闭Web驱动程序实例或销毁Web驱动程序实例(关闭所有窗口)。

Dispose() -我不知道这种方法。


3
如果您使用的是.NET语言绑定,则QuitDispose方法应该是彼此的同义词。换句话说,Quit调用Dispose
JimEvans

22

driver.close并且driver.quit是在硒的webdriver关闭浏览器会话两种不同的方法。了解两者并知道何时使用每种方法对您的测试执行很重要。因此,我试图阐明这两种方法。

driver.close-此方法关闭设置焦点的浏览器窗口。尽管此方法的名称很熟悉,WebDriver并未实现AutoCloseableinterface

driver.quit–此方法基本上调用driver.dispose了now内部方法,该方法又关闭了所有浏览器窗口并正常结束了WebDriver会话。

driver.dispose-如前所述,这是WebDriver的内部方法,已根据另一个答案以静默方式删除了该方法-需要验证。在常规测试工作流程中,此方法确实没有用例,因为上述两种方法中的任何一种都适用于大多数用例。

说明用例:driver.quit每当结束程序时都应使用。它将关闭所有打开的浏览器窗口,并终止WebDriver会话。如果未driver.quit在程序末尾使用,则WebDriver会话将无法正确关闭,并且不会从内存中清除文件。这可能会导致内存泄漏错误。

上面的解释应该解释WebDriver中driver.closedriver.quit方法之间的区别。希望对你有帮助。

以下网站提供了有关硒测试的一些好技巧:链接


14

quit():退出此驱动程序,关闭所有打开的关联窗口。

close() :关闭当前窗口,如果它是当前打开的最后一个窗口,则退出浏览器。


这个答案错过了关键的区别:quit()将停止底层的webdriver服务,而close()不会。专家提示:如果只剩下一个窗口,则永远不要调用close()
Corey Goldberg'9

5

close():-假设您已经使用相同的驱动程序实例打开了多个浏览器窗口,现在在驱动程序实例上调用close()将关闭该驱动程序实例指向的当前窗口。但是驱动程序实例仍保留在内存中,可用于处理其他打开的浏览器窗口。

quit():-如果在驱动程序实例上调用quit(),并且打开了一个或多个浏览器窗口,它将关闭所有打开的浏览器窗口,并且驱动程序实例已被垃圾回收,即从内存中删除。因此,现在您无法在调用quit()之后使用此驱动程序实例执行其他操作。如果这样做,将引发异常。

dispose():-我认为WebDriver实例没有dispose方法。

您可以转到此硒官方java doc 链接以供参考。


“我认为WebDriver实例没有处理方法。” 当然有(至少在C#中)。
EJoshuaS-恢复莫妮卡

5

基于PhantomJS的Github上的问题,quit()不会终止PhantomJS进程。您应该使用:

import signal
driver = webdriver.PhantomJS(service_args=service_args)
# Do your work here

driver.service.process.send_signal(signal.SIGTERM)
driver.quit()

链接


5

close()是一个Webdriver命令,用于关闭当前处于焦点的浏览器窗口。尽管此方法的名称很熟悉,WebDriver并未实现AutoCloseableinterface

在自动化过程中,如果打开了多个浏览器窗口,则close()命令将仅关闭当时具有焦点的当前浏览器窗口。其余的浏览器窗口将不会关闭。以下代码可用于关闭当前浏览器窗口:

quit()是一个Webdriver命令,该命令调用driver.dispose方法,该方法又关闭所有浏览器窗口并终止WebDriver会话。如果在程序末尾不使用quit(),则WebDriver会话将无法正确关闭,并且文件也不会从内存中清除。这可能会导致内存泄漏错误。

如果自动化过程仅打开一个浏览器窗口,则close()和quit()命令的工作方式相同。如果在自动化期间打开了多个浏览器窗口,则两者的功能将有所不同。

对于上述参考:单击此处

Dispose命令 Dispose()应该调用Quit(),看起来确实如此。但是,它也具有相同的问题,即在手动关闭PhantomJS之前,所有后续操作都将被阻止。

参考链接


3

driver.close()和driver.quit()之间的区别

driver.close –关闭在其上设置焦点的浏览器窗口。

driver.quit –它基本上调用driver.dispose方法,该方法依次关闭所有浏览器窗口并正常结束WebDriver会话。


2

Selenium WebDriver

  1. WebDriver.Close()此方法用于关闭当前打开的窗口。它会关闭当前打开的驱动程序所关注的窗口。

  2. WebDriver.Quit()此方法用于销毁WebDriver的实例。它将关闭与该驱动程序关联的所有浏览器Windows,并安全地结束会话。WebDriver.Quit()调用Dispose。

  3. WebDriver.Dispose() 此方法关闭所有浏览器窗口并安全结束会话


4
如果您引用某些内容,则应提供来源。
Meirion Hughes,

2

我的理解是driver.close();将关闭当前浏览器,并driver.quit();终止所有浏览器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.