这些有什么区别
Webdriver.Close()
Webdriver.Quit()
Webdriver.Dispose()
使用哪一个以及何时使用?
这些有什么区别
Webdriver.Close()
Webdriver.Quit()
Webdriver.Dispose()
使用哪一个以及何时使用?
这是一个很好的问题,我看到人们不应该使用 Close()。我查看了 Selenium Client & WebDriver C# Bindings 的源代码,发现了以下内容。
webDriver.Close()
- 关闭驱动程序关注的浏览器窗口 webDriver.Quit()
- 调用 Dispose() 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 服务器上的会话。如果会话未关闭,则该会话的日志文件将保留在内存中。
Close()
- 用于关闭当前处于焦点的浏览器或页面。
Quit()
- 用于关闭 Web 驱动实例或销毁 Web 驱动实例(关闭所有窗口)。
Dispose()
- 我不知道这种方法。
driver.close
并且driver.quit
是在 Selenium WebDriver 中关闭浏览器会话的两种不同方法。了解它们并知道何时使用每种方法在您的测试执行中很重要。因此,我试图阐明这两种方法。
driver.close
- 此方法关闭设置焦点的浏览器窗口。尽管这个方法的名字很熟悉,WebDriver
但它并没有实现AutoCloseable
接口。
driver.quit
– 这个方法基本上调用driver.dispose
了一个现在内部的方法,该方法依次关闭所有浏览器窗口并优雅地结束 WebDriver 会话。
driver.dispose
- 如前所述,是 WebDriver 的内部方法,已根据另一个答案静默删除 - 需要验证。这种方法在正常的测试工作流程中确实没有用例,因为前面的任何一种方法都应该适用于大多数用例。
说明用例:您应该driver.quit
在想要结束程序时使用。它将关闭所有打开的浏览器窗口并终止 WebDriver 会话。如果您在程序结束时不使用driver.quit
,WebDriver 会话将无法正常关闭,文件也不会从内存中清除。这可能会导致内存泄漏错误。
上面的解释应该解释了WebDriver中driver.close
和方法的区别。driver.quit
希望对你有帮助。
以下网站有一些关于硒测试的好技巧:链接
quit()
:退出此驱动程序,关闭所有打开的关联窗口。
close()
:关闭当前窗口,如果它是当前打开的最后一个窗口,则退出浏览器。
close()是一个 webdriver 命令,用于关闭当前焦点所在的浏览器窗口。尽管这个方法的名字很熟悉,WebDriver
但它并没有实现AutoCloseable
接口。
在自动化过程中,如果打开了多个浏览器窗口,则 close() 命令将仅关闭当时具有焦点的当前浏览器窗口。其余的浏览器窗口不会关闭。以下代码可用于关闭当前浏览器窗口:
quit()是一个调用 driver.dispose 方法的 webdriver 命令,该方法依次关闭所有浏览器窗口并终止 WebDriver 会话。如果我们在程序结束时不使用 quit(),WebDriver 会话将不会正确关闭,文件也不会从内存中清除。这可能会导致内存泄漏错误。
如果自动化进程仅打开一个浏览器窗口,则 close() 和 quit() 命令的工作方式相同。当自动化期间打开多个浏览器窗口时,两者的功能会有所不同。
以上参考:点击这里
Dispose 命令 Dispose() 应该调用 Quit(),而且看起来确实如此。但是,它也有同样的问题,任何后续操作都会被阻止,直到手动关闭 PhantomJS。
参考链接
基于 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()
close():-假设你打开了多个具有相同驱动程序实例的浏览器窗口,现在在驱动程序实例上调用 close() 将关闭驱动程序实例指向的当前窗口。但驱动程序实例仍保留在内存中,可用于处理其他打开的浏览器窗口。
quit():- 如果您在驱动程序实例上调用 quit() 并且打开了一个或多个浏览器窗口,它将关闭所有打开的浏览器窗口,并且驱动程序实例被垃圾收集,即从内存中删除。所以现在你不能在调用 quit() 后使用这个驱动实例做其他操作。如果你这样做,它会抛出一个异常。
dispose():- 我不认为 WebDriver 实例有 dispose 方法。
你可以去这个 selenium 官方 java doc链接以供参考。
Selenium 网络驱动程序
WebDriver.Close()
此方法用于关闭当前打开的窗口。它关闭驱动程序关注的当前打开的窗口。
WebDriver.Quit()
该方法用于销毁 WebDriver 的实例。它关闭与该驱动程序关联的所有浏览器窗口并安全地结束会话。WebDriver.Quit() 调用 Dispose。
WebDriver.Dispose()
此方法关闭所有浏览器窗口并安全地结束会话
driver.close() 和 driver.quit() 之间的区别
driver.close - 它关闭设置焦点的浏览器窗口。
driver.quit - 它基本上调用 driver.dispose 方法,该方法依次关闭所有浏览器窗口并优雅地结束 WebDriver 会话。
退出和关闭有两个区别。
输入网址后,相同的会话 ID - 73e6d7c2ae55d9f059ad1cce248adb75
currentUrl() 之后的会话 ID - 73e6d7c2ae55d9f059ad1cce248adb75
如果用户尝试执行任何语句,会话 ID null 将发送到服务器。看到这一点,服务器将发送异常 -会话 ID 为空。调用 quit() 后使用 WebDriver?
在 Close() 中,将为整个会话创建和维护随机会话 ID(只有一个)。执行 Close() 后,会话将无效或过期。 例外
因此,在 quit() 中,会话为空,而在 close() 中,会话 id 无效。
我的理解是driver.close();
会关闭当前浏览器,并且driver.quit();
会终止所有浏览器。
driver.close() 和 driver.quit() 在会话 ID 方面的区别。
driver.close
– 它关闭设置焦点的浏览器窗口,如果之后使用驱动程序实例,driver.close
则 selenium throw NoSuchSessionException: invalid session id
driver.quit
– 它基本上调用 driver.dispose 方法,该方法依次关闭所有浏览器窗口并优雅地结束 WebDriver 会话,如果之后使用驱动程序实例,driver.quit
则 selenium throw NoSuchSessionException: session id is null