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')
Другие вопросы по тегам