【问题标题】:Difference between webdriver.Dispose(), .Close() and .Quit()webdriver.Dispose()、.Close() 和 .Quit() 之间的区别
【发布时间】:2013-02-10 14:30:54
【问题描述】:

这些有什么区别

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

什么时候使用哪个?

【问题讨论】:

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

标签: selenium-webdriver


【解决方案1】:

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

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

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

【讨论】:

  • 如果您使用 .NET 语言绑定,QuitDispose 方法应该是彼此的同义词。换句话说,Quit 调用 Dispose
【解决方案2】:

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

  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() 方法。

注意
当我试图找出为什么我的虚拟机硬盘空间不足的相关问题时,我发现了这个问题。结果发现异常导致每次运行都没有调用 Quit() 或 Dispose() ,从而导致 appData 文件夹填满硬盘驱动器。所以我们正确地使用了 Quit() 方法,但是代码无法访问。摘要确保所有代码路径都将通过使用异常安全模式或实现 IDisposable 来清理您的非托管对象

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

【讨论】:

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

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

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

【讨论】:

  • 这个答案错过了关键区别:quit() 将停止底层的 webdriver 服务,而 close() 不会。专业提示:如果只剩下一个窗口,则永远不要调用 close()
【解决方案4】:

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

driver.close - 此方法关闭设置焦点的浏览器窗口。尽管这个方法的名字很熟悉,WebDriver 确实没有实现AutoCloseable interface

driver.quit - 这个方法基本上调用driver.dispose 一个现在内部的方法,它依次关闭所有浏览器窗口并优雅地结束 WebDriver 会话。

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

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

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

以下网站有一些关于硒测试的好技巧:Link

【讨论】:

  • 我还注意到,如果您使用 driver.close() 方法,用于处理基于 IE 的自动化的 IEDrivers 不会退出。我不得不使用 driver.quit() 来终止它。这是因为与 close() 不同,quit() 方法似乎也可以清理资源,尽管在我的示例中,我始终只有一个选项卡。
【解决方案5】:

Selenium 网络驱动程序

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

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

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

【讨论】:

  • 如果你引用了一些东西,你应该给出出处。
【解决方案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()

link

【讨论】:

    【解决方案7】:

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

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

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

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

    【讨论】:

    • " 我认为 WebDriver 实例没有 dispose 方法。" 当然有(至少在 C# 中)。
    【解决方案8】:

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

    【讨论】:

      【解决方案9】:

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

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

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

      【讨论】:

        【解决方案10】:

        close() 是一个 webdriver 命令,用于关闭当前焦点所在的浏览器窗口。尽管这个方法的名字很熟悉,WebDriver 确实没有实现AutoCloseable interface

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

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

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

        以上参考:click here

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

        参考Link

        【讨论】:

          【解决方案11】:

          driver.close() 和 driver.quit() 在会话 ID 方面的区别。

          driver.close – 它关闭设置焦点的浏览器窗口并 如果在 driver.close 之后使用驱动程序实例,则 selenium 抛出 NoSuchSessionException: invalid session id

          driver.quit - 它基本上调用 driver.dispose 方法,该方法依次关闭所有浏览器窗口并优雅地结束 WebDriver 会话 如果在 driver.quit 之后使用驱动程序实例,则 selenium 抛出 NoSuchSessionException: session id is null

          【讨论】:

            【解决方案12】:

            退出和关闭有两个区别。

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

            after entering the url the same Session ID - 73e6d7c2ae55d9f059ad1cce248adb75

            After the currentUrl() the session ID - 73e6d7c2ae55d9f059ad1cce248adb75

            After quit() the browser the session ID - null

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

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

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

            【讨论】:

              猜你喜欢
              • 2014-05-31
              • 1970-01-01
              • 2022-12-03
              • 2019-12-21
              • 2021-08-04
              • 2020-09-26
              • 2013-11-03
              • 1970-01-01
              相关资源
              最近更新 更多