Pytest,selenium,fixture在第一个测试InvalidSessionIdException之后抛出错误



我有一个fixture文件

import pytest
from selenium.webdriver.chrome.options import Options as chrome_options
from driver.singleton_driver import WebDriver

@pytest.fixture
def get_chrome_options():
options = chrome_options()
options.add_argument('chrome')
options.add_argument('--start-maximized')
options.add_argument('--window-size=1920,1080')
options.add_argument('--incognito')
return options

@pytest.fixture
def get_webdriver(get_chrome_options):
options = get_chrome_options
driver = WebDriver(options).driver
return driver

@pytest.fixture(scope='function')
def setup(request, get_webdriver):
driver = get_webdriver
if request.cls is not None:
request.cls.driver = driver
yield driver
driver.close()

我的测试文件

import pytest
@pytest.mark.usefixtures('setup')
class TestSteamPages:
def test_first(self):
self.driver.get('https://www.google.com/')

def test_second(self):
self.driver.get('https://www.google.com/')

据我所知,在第一次测试之后,driver.close((fixture中的函数被触发。但是,当运行第二个测试时,fixture不会重新启动网络驱动程序。错误

venv/lib/python3.10/site-packages/selenium/webdriver/remote/errorhandler.py:243: InvalidSessionIdException
============================================================================== short test summary info ==============================================================================
FAILED tests/test_first.py::TestSteamPages::test_second - 
selenium.common.exceptions.InvalidSessionIdException: Message: invalid session id
ERROR tests/test_first.py::TestSteamPages::test_second - selenium.common.exceptions.InvalidSessionIdException: Message: invalid session id

对于驱动程序,我使用Singleton模式

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager

class WebDriver:
class __WebDriver:
def __init__(self, options):
self.driver = webdriver.Chrome(options=options, service=ChromeService(ChromeDriverManager().install()))
driver = None
def __init__(self, options):
if not self.driver:
WebDriver.driver = WebDriver.__WebDriver(options=options).driver

由于单例,driver未重新初始化。WebDriver.driver在第一次测试之前初始化,所以在setup下次运行时,if not self.driverFalse,因为self.driver不再是None

如果你想在每次测试中初始化WebDriver,不要使用单例

@pytest.fixture
def get_webdriver(get_chrome_options):
options = get_chrome_options
driver = webdriver.Chrome(options=options, service=ChromeService(ChromeDriverManager().install()))
return driver

如果您只想初始化WebDriver一次,您可以将fixture范围更改为'class'(用于TestSteamPages中的所有测试(,甚至可以将其移动到conftest.py,范围为'session',用于所有测试的一个驱动程序实例。注意,在这种情况下,所有固定装置都需要具有scope='class'

@pytest.fixture(scope='class')
def setup(request, get_webdriver):
driver = get_webdriver
if request.cls is not None:
request.cls.driver = driver
yield driver
driver.close()

相关内容

最新更新