我应该在每次基于Selenium的自动测试之后退出浏览器吗?

我应该在每次基于Selenium的自动测试之后退出浏览器吗?,selenium,selenium-webdriver,webdriver,automated-tests,Selenium,Selenium Webdriver,Webdriver,Automated Tests,我正试图使我的selenium测试尽可能原子化并相互独立,因此我决定退出浏览器,并在每次测试运行后创建一个新的Webdriver实例。这种方法对我来说更有意义,并且通过讨论这个问题的几个线程得到了加强。 Eg 您将在一次特定测试后关闭webdriver。这是一个很好的方法,但是您需要为每个要运行的新测试启动一个新的webdriver 然而,我也发现在每次测试后退出浏览器是不必要的,也是无效的。 Eg 在每次测试之前加载浏览器不是一个好的做法。相反,最好在所有测试之前加载浏览器,然后在执行所有测试

我正试图使我的selenium测试尽可能原子化并相互独立,因此我决定退出浏览器,并在每次测试运行后创建一个新的Webdriver实例。这种方法对我来说更有意义,并且通过讨论这个问题的几个线程得到了加强。 Eg

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

然而,我也发现在每次测试后退出浏览器是不必要的,也是无效的。 Eg

在每次测试之前加载浏览器不是一个好的做法。相反,最好在所有测试之前加载浏览器,然后在执行所有测试之后关闭浏览器,因为这将节省资源和测试执行时间


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

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

如果您的测试是独立的,则明智的做法是在每次测试运行后创建当前Webdriver和浏览器客户端实例,并创建Webdriver和浏览器客户端的新实例,这将启动新的、干净的Webdriver/浏览器客户端组合,如中所述

尽管会产生一些开销,以产生新的WebDriver/浏览器客户端组合,但这可能会从CPU和内存使用方面提供急需的缓冲,如中所述:


在这种情况下,测试不是独立的,测试基于相同的会话cookie等参数,重用相同的WebDriver/浏览器客户端是有意义的。

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\u browser()
可以为整个测试模块提供一个浏览器。
function\u 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 fixture:

是的,这是个好主意。通常,您希望每个测试都在已知状态下启动,而不是在以前的测试遗留下来的污染状态下启动。我看到的所有最佳实践文档都声明测试应该是独立的。在每次测试运行时启动新的浏览器实例有助于保持每次运行的干净状态。进行独立测试并为每次运行启动一个新的浏览器可以将页面清除为并行执行,这就是实时节省的地方。这里只有一个来自SauceLabs的最佳实践文档示例:。感谢您的回答,将这两种方法结合起来显然是可行的。我还没有深入研究pytest夹具,因为我使用的pytest selenium pluggin在引擎盖下起了很大的作用。然而,我正计划回到他们身边,试着完全理解他们,使我的测试在未来更加健壮。很高兴能提供帮助!我还没有尝试过pytest selenium插件,我来看看。我使用Aerokube/Selenoid运行一个本地和远程网格实例,所以我只是手工构建了一个连接器并使用它。我会检查一下插件!