【问题标题】:Should I quit the browser after each Selenium based automated test?每次基于 Selenium 的自动化测试后,我应该退出浏览器吗?
【发布时间】:2019-08-03 22:05:47
【问题描述】:

我正在尝试使我的 selenium 测试尽可能原子且彼此独立,因此我决定退出浏览器并在每次测试运行后创建一个新的 Webdriver 实例。这种方法对我来说更有意义,并且通过讨论这个问题的几个线程得到了加强。 e. G。 This answer to a related question:

您将在一项特定测试后关闭网络驱动程序。这是一个很好的方法,但您需要为每个要运行的新测试启动一个新的 webdriver。

但是,我也遇到过这样的观点,即在每次测试后退出浏览器是不必要且无效的。 e. G。 Part of this blog about Selenium:

在每次测试之前加载浏览器并不是一个好习惯。相反,最好在所有测试之前加载浏览器,然后在执行所有测试后关闭它,因为这样可以节省资源和测试执行时间。

由于我对这一切都很陌生,因此我很难在这两者之间做出选择。到目前为止,我的测试的执行时间并不是一个真正的问题(因为我只有少数几个),但是当我开始扩展我的测试套件时,我担心它可能会成为一个问题。

【问题讨论】:

  • 是的,这是个好主意。您通常希望每个测试都以已知状态开始,而不是之前测试遗留的污染状态。

标签: selenium selenium-webdriver webdriver automated-tests


【解决方案1】:

直接回答,事实上在执行时退出或重用相同的浏览器客户端没有明确的规则没有 测试 使用 Selenium。也许该决定将基于 测试用例的先决条件。

如果您的 测试 是独立的,明智的做法是 quit() 当前的 Webdriver 和 Browser Client 实例并创建一个新的Webdriver 和 Browser Client 的实例在每次测试运行后将启动一个新的干净的 WebDriver / Browser Client closing browser after test pass 中讨论的组合。

虽然它会引起一些开销来产生新的 WebDriver / Browser Client 组合,但这可能会提供急需的缓冲CPU 和 内存 使用情况,如下所述:

以防万一,测试不是独立的,测试基于相同的会话,cookies等参数,重用同一个WebDriver/Browser Client是有意义的。

【讨论】:

  • 我见过的所有最佳实践文档都声明测试应该是独立的。在每次测试运行时启动一个新的浏览器实例有助于保持每次运行的干净状态。进行独立测试并为每次运行启动一个新浏览器会将页面清除为并行执行,这是真正节省时间的地方。这只是来自 SauceLabs 的一个示例最佳实践文档:wiki.saucelabs.com/display/DOCS/…。
【解决方案2】:

DebanjanB 有一个很好的答案。 我是那种没有一刀切的答案的人。

有一些有趣的平衡。根据您使用的框架,您可能会很喜欢。我喜欢 pytest,因为它对固定装置的独特用途。

为此,您可以根据您的需要进行测试,或者以任何一种方式进行测试集。您可以在有意义的情况下平衡浏览器加载时间与执行。

以pytest为例:

conftest.py:

import pytest
from selenium import webdriver

@pytest.fixture(scope='module')
def module_browser(request):
    """Fixture lasts for an entire file of tests."""
    driver = webdriver.Chrome()
    def fin():
        driver.quit()
    request.addfinalizer(fin())
    return driver

@pytest.fixture(scope='function')
def function_browser(request):
    """Fixture lasts for just a test function."""
    driver = webdriver.Chrome()
    def fin():
        driver.quit()
    request.addfinalizer(fin())
    return driver

现在module_browser() 让您可以使用浏览器来查看整个测试模块。 funtion_browser() 为每个测试函数提供一个新的浏览器。

让我们来看看吧.. 你有一堆测试需要登录,而且他们正在对一个标准帐户进行外观检查:

conftest.py 继续...

@pytest.fixture(scope='module')
def logged_in_browser(request):
    """Provide a logged in browser for simple tests."""
    driver = webdriver.Opera()
    # Now go and log this browser in, 
    # so we can use the logged in state for tests.
    log_in_browser(username='RedMage', password='masmune')   
    def fin():
        driver.quit()
    request.addfinalizer(fin())
    return driver

这大致相同,但允许您让浏览器保持打开状态进行几次测试,然后它就会登录。如果登录需要 5 秒,并且您有 30 次自动检查化妆品的测试,您可以刮胡子几分钟。

这种灵活性可以让您更快地运行一些测试,并在更干净的状态下运行一些测试。我们可能需要其中的一些来运行一个套件,并且仍然能够按时获得效率提升。没有万能的答案。

在 pytest 中使用fixture 可以让你为每个测试选择你想要的东西。如果它应该是一个干净的浏览器,或者它是否需要更快。

然后在测试中我们看到这样的东西: test_things.py

def test_logged_out_assets(function_browser):
    driver = function_browser  # just for clarity here.
    driver.get('http://example.com/')
    check_some_stuff(driver)

language_subdomain_list = ['www', 'es', 'de', 'ru', 'cz']
@pytest.parametrize(language_subdomain, language_subdomain_list)
def test_logged_out_assets_multlingual(module_browser, language_subdomain):
    """
    Check the assets come up on each language subdomain.

    This test will run for each of the subdomains as separate tests.
    5 in all.
    """
    driver = module_browser  # for clarity in example.
    url = "http://{}.example.com".format(language_subdomain)
    driver.get(url)
    check_some_stuff(driver)

def test_logged_in_assets(logged_in_browser):
    """
    Check specific assets while logged in.

    Remember, our web browser already is logged in when we get it!
    """
    driver = logged_in_browser  # for clarity in example.
    check_some_assets(driver)

Py.test 夹具:https://docs.pytest.org/en/latest/fixture.html

【讨论】:

  • 感谢您的回答,将这两种方法结合起来绝对可行。我还没有深入研究 pytest 固定装置,因为我正在使用的 pytest-selenium 插件在引擎盖下做了很多繁重的工作。但是,我计划回到他们身边并尝试完全理解它们,以使我的测试在未来更加稳健。
  • 很乐意为您提供帮助!我还没有尝试过 pytest-selenium 插件,我来看看。我使用 Aerokube/Selenoid 运行本地和远程网格实例,所以我只是手动构建了一个连接器并使用它。我会检查插件!
猜你喜欢
  • 1970-01-01
  • 2013-09-23
  • 2018-08-03
  • 1970-01-01
  • 2011-04-18
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多