Как разделить тесты и крепления

1

У меня есть пример проекта в PyCharm - состоит из простого теста, который проверяет вход в заданное правильное рабочее пространство Slack. В нем есть каталог web_drivers с chromedriver внутри, conftest.py с настройкой webdriver для test и tests.py с настоящим test, например

conftest.py

import os
import pytest
from selenium import webdriver

@pytest.fixture(scope='class')
def driver_get(request):
    web_driver = webdriver.Chrome(executable_path=os.path.join("web_drivers","chromedriver.exe"))
    yield web_driver

def fin():
    web_driver.close()

request.addfinalizer(fin)

tests.py

import pytest

class TestSlackWorkspace(object):
    @pytest.fixture(autouse=True)
    def setup(self, driver_get):
        self.driver = driver_get
        self.driver.get("https://slack.com/signin")
        self.input_field = self.driver.find_element_by_xpath(
        "//input[@type='text' and @id='domain']")
        self.continue_button = self.driver.find_element_by_xpath(
        "//button[@id='submit_team_domain']")

    def test_correct_workspace(self):
        self.input_field.send_keys("test")
        self.continue_button.click()
        assert self.driver.find_element_by_xpath("//h1[@id='signin_header']"
        ).is_displayed(), "Login page should be displayed"

Теперь вопрос состоит в том, чтобы разделить тест на часть инициализации страницы - def setup и фактическую часть выполнения теста - def test_correct_workspace на разные классы и файлы (что-то вроде шаблона объекта страницы).

Таким образом, база conftest.py должна быть одинаковой и делить test.py на ie

page.py

class SlackWorkspace(object):
    @pytest.fixture(autouse=True)
    def __init__(self, driver_get):
        self.driver = driver_get
        self.driver.get("https://slack.com/signin")
        self.input_field = self.driver.find_element_by_xpath("//input[@type='text' and @id='domain']")
        self.continue_button = self.driver.find_element_by_xpath("//button[@id='submit_team_domain']")

test.py

class TestWorkspace(object):
    def test_correct_workspace(self):
        self.input_field.send_keys("test")
        self.continue_button.click()
        login_page = self.driver.find_element_by_xpath("//h1[@id='signin_header']")
        assert login_page.is_displayed(), "Login page should be displayed"

Но наверняка это не будет работать в такой форме:

1) Каким-то образом driver_get должен быть импортирован в файл инициализации страницы и перенаправлен в __init__ -?

2) Как-то инициализация страницы должна быть связана с реализацией теста в другом files-?

Понятия не имею, как организовать весь этот импорт между отдельными файлами

Теги:
selenium
pycharm
pytest

3 ответа

1

В шаблоне Page Object следует избегать прямой ссылки на драйвер в тестовых классах. Вы можете использовать page.py в качестве базового класса, чтобы иметь общие методы. Настройка может быть перемещена на другую страницу, например, login.py. Этот метод настройки должен возвращать страницу, которую вы пытаетесь проверить. Методы тестирования должны затем использовать эти объекты страницы для проверки. Я сохраняю логин в качестве фиксатора в conftest.py, а затем использую его во всех тестах и других тестах. Например, вот моя попытка дать вам обзор. Вы должны прочитать больше на шаблоне страницы объекта.

Я рекомендую использовать плагин pytest-selenium, который уменьшает много стандартного кода при использовании selenium с pytest

conftest.py

@fixture
def selenium(): 
     # pytest-selenium provides this fixture & you can override it if required.
    return selenium

@fixture
def home(selenium):
    #do login
    return HomePage

login.py

from page import Page #Import base class with common methods.

class LoginPage(Page):

def login(self, driver):
    #do the login steps
    return HomePage   #return Landing Page

test_login.py

def test_login_successful(home):  #Use the home fixture
     assert home.is_displayed("xyz")
  • 0
    Спасибо, это было полезно, чтобы решить это
0

Назар привет, как можно с тобой связываться? Есть вопросы по Python и Page Object Pattern и нужна бюджетная помощь для разработки фреймворка?

Буду OCEN благодарен! Как реализовать Pytest для Page Object? Я могу дать вам мой кусок кода

Влад

0

Удалось найти решение для этого с помощью pytest → Как использовать возвращаемое значение прибора в методе тестирования в классе и некоторые объяснения от более опытного человека следующим образом

1) Оказывается, что приспособление в conftest должно передать инициализированный веб-драйвер для моей страницы pages.py из pages.py и инициализировать этот класс страницы этим драйвером с помощью встроенного приспособления request. Так что правильный conftest.py будет выглядеть так:

import pytest
import os
from selenium import webdriver
from pages import SigninPage

@pytest.fixture(scope='class', autouse=True)
def driver_get(request):
    request.cls.webdriver = webdriver.Firefox(executable_path=os.path.join("web_drivers", "geckodriver"))
    request.cls.signin = SigninPage(request.cls.webdriver)
    yield request.cls.webdriver

    def fin():
        request.cls.webdriver.quit()
    request.addfinalizer(fin)

2) "pages.py" включает в себя SigninPage с полученным веб-драйвером, поле ввода для ввода рабочей области и кнопку для продолжения, метод enter_workspace который фактически это делает, и возвращает LogInPage с полем login_page для проверки, поэтому он выглядит следующим образом:

class SigninPage(object):
    def __init__(self, web_driver):
        self.driver = web_driver
        self.driver.get("https://slack.com/signin")

        self.input_field = self.driver.find_element_by_xpath("//input[@type='text' and @id='domain']")
        self.continue_button = self.driver.find_element_by_xpath("//button[@id='submit_team_domain']")

    def enter_workspace(self):
        self.input_field.send_keys("test")
        self.continue_button.click()
        return LogInPage(self.driver)


class LogInPage(object):
    def __init__(self, web_driver):
       self.driver = web_driver
       self.login_page = self.driver.find_element_by_xpath("//h1[@id='signin_header']")

3) И, наконец, test.py состоит из двух вещей - входа в рабочую область путем вызова метода enter_workspace из SigninPage, который открывает LogInPage, и затем проверки, действительно ли отображается логин:

class TestSlackWorkspace(object):
    def test_workspace(self):
        login = self.signin.enter_workspace()
        assert login.login_page.is_displayed(), "Missing!"

Это все еще нужно улучшить, но заданная проблема решена. Спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню