Python Selenium запускает несколько тестовых классов в одном селеновом веб-драйвере с помощью pytest
Я новичок в Python, и я начал создавать набор тестов автоматизации с графическим интерфейсом (несколько тестовых случаев в разных файлах). Я хочу выполнить все свои тестовые случаи в одном веб-драйвере selenium, поэтому я создал класс singleton webdriver и хочу использовать этот класс во всех своих тестовых случаях. Вот мой класс синглтон-вебдрайвера:
from selenium import webdriver
class Webdriver(object):
"""
Singleton class based on overriding the __new__ method
"""
def __new__(cls):
"""
Override __new__ method to control the obj. creation
:return: Singleton obj.
"""
if not hasattr(cls, 'instance'):
cls.instance = super(Webdriver, cls).__new__(cls)
return cls.instance
@staticmethod
def get_driver():
"""
:return: Selenium driver
"""
dir = "C:\\Python36\\Lib\\site-packages\\selenium\\webdriver\\ie"
ie_driver_path = dir + "\\IEDriverServer.exe"
return webdriver.Ie(ie_driver_path)
и мой пример установки:
from Core.Webdriver import Webdriver
class LoginExternal(unittest.TestCase):
def setUp(self):
# Create Instances
self.web = Webdriver.get_driver()
self.matcher = TemplateMatcher()
self.gif = GifCapture("C:\\wifi\\Videos\\" + self._testMethodName + ".gif")
self.gif.start()
time.sleep(3)
def test_LoginExternal(self):
# Open External Login Page
self.web.maximize_window()
Вот моя проблема, когда я выполняю свой набор тестов, мой код создает новый экземпляр селена, но я хочу, чтобы во всех тестовых случаях использовался только один экземпляр селена.
Я использую pytest в качестве тестового бегуна с помощью следующей команды cmd:
pytest --pyargs --html=Report/External_04052018.html ExternalTestSuite/
Я думаю, что проблема заключается в том, что pytest использует новый процесс при каждом выполнении тестового примера. Есть ли способ предотвратить или использовать таким образом?
1 ответ
Самая большая особенность и преимущество Pytest по сравнению с традиционными бегунами семейства XUnit заключается в том, что он имеет приспособления. Я приглашаю вас использовать это. В вашем сценарии я бы избавился от расширения unittest.TestCase
а также setUp
метод в пользу приспособления pytest следующим образом:
import pytest
from Core.Webdriver import Webdriver
class TestLoginExternal:
@pytest.fixture(scope='class')
def driver(self):
print('Setup runs once before all tests in class')
driver = Webdriver.get_driver()
yield driver
driver.quit()
print('Teardown runs once after all tests in class')
def test_LoginExternal(self, driver):
# Open External Login Page
print('test_LoginExternal')
def test_LoginInternal(self, driver):
# Open External Login Page
print('test_LoginInternal')