Как разделить тесты и крепления - PullRequest
0 голосов
/ 10 декабря 2018

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

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) Каким-то образом инициализация страницы должна быть связана с реализацией теста в других файлах -?

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

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

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

1) Оказывается, что прибор в conftest должен передать инициализированный веб-драйвер для моей страницы входа из 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!"

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

0 голосов
/ 10 декабря 2018

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

Я рекомендую использовать плагин pytest-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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...