webdriver 之间的区别。Dispose()、.Close() 和 .退出()

Difference between webdriver.Dispose(), .Close() and .Quit()

提问人:Puran Joshi 提问时间:2/25/2013 最后编辑:zb226Puran Joshi 更新时间:6/9/2021 访问量:353787

问:

这些有什么区别

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

使用哪一个以及何时使用?

selenium-web驱动程序

评论

2赞 jordanpg 8/9/2015
#dispose 方法似乎已从 WebDriver API 中以静默方式删除。更新日志中没有提及,我能找到的最新提及是 v2.26 api 文档,我再也找不到链接了。
0赞 rcasady616 12/14/2016
我从下面的答案中看到了困惑的来源。我认为这个问题最初是一个 C# 问题,因为上面的方法(关闭、退出和处置)以大写字母 (C#) 而不是小写字母 (java) 开头。尚未从 C# WebDriver 客户端绑定中删除 Dispose。
0赞 Tamir Daniely 5/14/2018
Dispose 是一种 .Net 模式,因此未记录在 selenium 的 API 文档中。在 RemoteWebDriver 中,Quit 调用 Dispose,后者发送 Quit 命令 (DELETE /session/{sessionId})。客户端中有几个位置截获 Quit 命令。例如,FirefoxDriver .net 实现实际上会执行一个过程。如果进程未正常关闭,则调用 Kill()。

答:

55赞 Manigandan 2/25/2013 #1

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

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

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

评论

4赞 JimEvans 2/26/2013
如果使用 .NET 语言绑定,则 and 方法应是彼此的同义词。换句话说,调用 .QuitDisposeQuitDispose
302赞 rcasady616 6/24/2013 #2

这是一个很好的问题,我看到人们在不应该使用Close()的时候使用Close()。我查看了Selenium客户端和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 服务器上的会话。如果会话未关闭,则该会话的日志文件将保留在内存中。

评论

0赞 Mark Mayo 7/23/2013
您是如何更新例外情况的?只是去每一个并添加一个 quit()?
1赞 rcasady616 7/27/2013
在像 NUnit、JUnit 这样的测试框架中,您只需要确保 Dispose() 位于 TestTeardown() 或 TestFixtureTeardown() 中。在 C# 中,您可以只使用“using”语句,如果引发异常,则始终调用 Dispose。您可以在 Java 中执行类似操作,方法是使用 try catch finally 并将 Dispose 放在 finally 中。
1赞 RNS 5/4/2017
@rcasady616 这是我得到的最好的解释。谢谢你,我认为它值得点赞。
2赞 PixelMaster 7/5/2019
@Mr.Bultitude 好吧,这是可以理解的,考虑到没有区别^^ 根据这个答案,是重定向到Quit()Dispose()
1赞 rcasady616 7/8/2019
@PixelMaster,是的,是 100% 正确的,它基本上是重定向。我不是在 Selenium 中编写代码的人,我只能猜测为什么这两种方法都存在于 C# 客户端绑定中。他们可能希望在客户端语言中保持一种通用的“退出”方法,但也希望在“using”语句语法中使用驱动程序(女巫需要 Dispose() 方法)。这是我最好的猜测,要么是那个,要么是代码需要清理。
16赞 Ran Adler 5/18/2014 #3

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

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

评论

2赞 Corey Goldberg 9/9/2019
这个答案忽略了关键的区别:quit() 会停止底层的 webdriver 服务,而 close() 不会。 专业提示:如果只剩下一个窗口,永远不要调用 close()
45赞 Anudeep Samaiya 9/8/2015 #4

driver.close和是在 Selenium WebDriver 中关闭浏览器会话的两种不同方法。了解这两种方法并知道何时使用每种方法在测试执行中非常重要。因此,我试图阐明这两种方法。driver.quit

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

driver.quit– 此方法基本上调用现在内部方法,该方法反过来关闭所有浏览器窗口并优雅地结束 WebDriver 会话。driver.dispose

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

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

上面的解释应该解释 WebDriver 中 和 方法之间的区别。我希望你觉得它有用。driver.closedriver.quit

以下网站有一些关于硒测试的好提示: 链接

评论

0赞 Pavan Dittakavi 6/22/2020
我还注意到,如果您使用 driver.close() 方法,则用于处理基于 IE 的自动化的 IEDrivers 不会退出。我不得不使用 driver.quit() 来终止它。这是因为 quit() 方法似乎也不像 close() 那样清理资源,尽管在我的示例中,我总是有一个选项卡。
3赞 s10v10s 5/31/2016 #5

Selenium Web驱动程序

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

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

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

评论

5赞 Meirion Hughes 5/31/2016
如果你引用一些东西,你应该给出来源。
6赞 Wesam Na 1/26/2017 #6

根据 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赞 Prasanta Biswas 9/21/2017 #7

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

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

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

你可以去这个 selenium 官方 java 文档链接参考。

评论

0赞 EJoshuaS - Stand with Ukraine 10/21/2017
“我不认为 WebDriver 实例有处置方法。”当然有(至少在 C# 中)。
1赞 BIUbiubiu 5/19/2018 #8

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

3赞 Nagarjuna Yalamanchili 5/28/2018 #9

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

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

driver.quit – 它基本上调用 driver.dispose 方法,该方法反过来关闭所有浏览器窗口并优雅地结束 WebDriver 会话。

10赞 Dhaval Atri 8/24/2018 #10

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

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

quit() 是一个 WebDriver 命令,它调用 Driver.Dispose 方法,该方法反过来关闭所有浏览器窗口并终止 WebDriver 会话。如果我们在程序结束时不使用 quit(),WebDriver 会话将无法正确关闭,并且文件不会从内存中清除。这可能会导致内存泄漏错误。

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

以上参考:点击这里

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

参考链接

-2赞 Vaibhav Jagdale 6/5/2021 #11

driver.close() 和 driver.quit() 在会话 ID 方面的差异。

driver.close– 它关闭了设置焦点的浏览器窗口,并 如果在之后使用驱动程序实例,则 selenium throw NoSuchSessionException:无效的会话 IDdriver.close

driver.quit– 它基本上调用 driver.dispose 方法,该方法反过来关闭所有浏览器窗口并优雅地结束 WebDriver 会话,并且 如果在此之后使用驱动程序实例,则 selenium throw NoSuchSessionException:会话 ID 为 nulldriver.quit

3赞 Magnus Infanteena 6/9/2021 #12

Quit 和 close 之间有两个区别。

  1. 由于 Quit() 关闭程序打开的所有窗口,而 Close() 将关闭正确的窗口,其中焦点集中在设置上。
  2. Quit () - 考虑,WebDriver driver = new ChromeDriver(); 上面的语句将创建一个会话 ID。为整个会话维护相同的会话 ID。会话 ID - 73e6d7c2ae55d9f059ad1cce248adb75

输入 url 后,会话 ID 相同 - 73e6d7c2ae55d9f059ad1cce248adb75

在 currentUrl() 之后,会话 ID - 73e6d7c2ae55d9f059ad1cce248adb75

退出()浏览器后,会话ID - null

如果用户尝试执行任何语句,会话 ID null 将发送到服务器。看到这种情况后,服务器将发送异常 - 会话 ID 为 null。调用 quit() 后使用 WebDriver?

在 Close() 中,将为整个会话创建和维护随机会话 ID(只有一个)。执行 Close() 后,会话将无效或过期例外

因此,在 quit() 中,会话为 null,而在 close() 中,会话 ID 无效。