Как запустить tearDown и установить в conftest.py - PullRequest
2 голосов
/ 01 октября 2019

Мне нужна помощь с моим кодом pytest / selenium.

У меня есть следующий код в моем файле conftest.py .

import pytest
from base.webdriverfactory import WebDriverFactory
from pages.login_page import LoginPage

@pytest.fixture(scope="class")
def oneTimesetUp(request, browser):
   print("Running one time setUp")
   wdf = WebDriverFactory(browser)
   driver = wdf.getWebDriverInstance()
   lp = LoginPage(driver)
   lp.login("haykpo", "Aaaa4321")

   if request.cls is not None:
       request.cls.driver = driver
   yield driver
   lp.log_out_from_wp_page()
   driver.quit()
   print("Running one time tearDown")

А вот мойтестовый файл, в котором я использую это приспособление

@pytest.mark.usefixtures("oneTimesetUp", "tearDown")
class TestPublishWithOfflinewAsset:

    @pytest.fixture(autouse=True)
    def objectSetup(self, oneTimesetUp):
        self.pub = TestPublishofflineWOMedia(self.driver)

    def test_publish_with_off_w_media(self):
        self.pub.select_project('Test cases - Avallain')
        self.pub.check_lo_plays_normally(15292)

Я знаю, что все, что идет после yield, должно быть кодом tearDown. Итак, я написал эти 2 строки, чтобы выйти из приложения и выйти из браузера в конце выполнения теста.

lp.log_out_from_wp_page()
driver.quit()

Однако проблема заключается в том, что часть выхода из системы (что интересно, не выходная) всегда выполняется после нескольких шагов, когда начинается мой тест и когда фокус браузера переключается на iframe во время выполнения теста (или можетбудь это просто совпадение, я не уверен, виновен ли здесь iframe). Как я могу составить свой код, чтобы запустить мой журнал разборки или что я хочу после yield, как предполагалось, но не во время выполнения теста?

Для более подробной информации вот подробные файлы с кодом. Ниже приведена моя страница входа в систему

from base.basepage import BasePage

class LoginPage(BasePage):

    def __init__(self, driver):
        super().__init__(driver)
        self.driver = driver

    ### Locators ###
    _name_field = "form1:Name"
    _password_field = "form1:Password"
    _login_button = "form1:loginButton"
    _work_packages = "wpButton"
    _user_logout_dropdown_button = 'rolebutton_button'
    _logout_button = 'blogout'


    def log_out_from_wp_page(self):
        self.elementClick(locator=self._user_logout_dropdown_button)
        self.driver.implicitly_wait(5)
        self.elementClick(locator=self._logout_button)

А ниже - фабрика веб-драйверов

class WebDriverFactory:

    def __init__(self, browser):
        self.browser = browser

    def getWebDriverInstance(self):
        """
       Get WebDriver Instance based on the browser configuration

        Returns:
            'WebDriver Instance'
        """
        global driver
        baseURL = "https://example.com"
        if self.browser == "iexplorer":
            # Set ie driver
            driver = webdriver.Ie()
        elif self.browser == "firefox":
            driver = webdriver.Firefox()
        elif self.browser == "chrome":
            # Set chrome driver
            driver = webdriver.Chrome()
            #driver.set_window_size(1440, 900)
        else:
            driver = webdriver.Chrome()
        # Setting Driver Implicit Time out for An Element
        driver.implicitly_wait(10)
        # Maximize the windows
        driver.maximize_window()
        # Loading browser with App URL
        driver.get(baseURL)
        return driver 

Ниже приведена BasePsge

class BasePage(SeleniumDriver):

   def __init__(self, driver):

        super(BasePage, self).__init__(driver)
        self.driver = driver
...