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

问题描述 投票:3回答:2

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

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

但是,我也认为在每次测试后退出浏览器是不必要和无效的。即G。 Part of this blog about Selenium:

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

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

selenium selenium-webdriver webdriver automated-tests
2个回答
2
投票

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

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

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

Incase,测试不是独立的,测试基于相同的会话,cookie等参数,重用相同的WebDriver / Browser Client是有意义的。


3
投票

DebanjanB有一个很好的答案。我是布料,没有一个适合所有人的答案。

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

为此,您可以根据需要进行测试或测试。您可以平衡浏览器加载时间与执行的意义。

作为pytest中的一个例子:

conf test.朋友:

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

© www.soinside.com 2019 - 2024. All rights reserved.