Перейти к содержимому

Фотография

Создание тестовой базы через UI с помощью фикстуры


  • Авторизуйтесь для ответа в теме
В теме одно сообщение

#1 RoenEr

RoenEr

    Новый участник

  • Members
  • Pip
  • 6 сообщений
  • ФИО:Коган Дмитрий

Отправлено 14 апреля 2021 - 21:12

Добрый день. Начинаю писать автотесты на python + selenium. Опыта у меня в этом нет. При помощи ютуба, разных примеров и каких то общих знание после ВУЗа смог поднять проект который работает) Он построен по паттерну Page Object. Впереди меня ждут кейсы которые начинаются с одного и того же начального условия (на какой то странице создана строка в таблице и на основе этой записи создается другая страница которая берет данные из этой таблички). На данный момент в каждом тесте я дохожу до этой таблицы, создаю запись, заполню нужные столбцы и после создаю ту страницу которую и предстоит тестировать, перехожу на нее и проверяю все что нужно. Т.к. таких страниц предстоит создавать много (они все разные, но суть одна) появилась мысль написать фикстуру со "scope='session'" которая заполнит мне эту таблицу полностью и потом все тесты которым нужна эта запись будут ее использовать (и после фикстура подчистит за собой эту запись). Написал функцию при помощи все тех же элементов страниц, вызываю ее в фикстуре но получаю ошибку "AttributeError: 'CreateTestData' object has no attribute 'driver'. Автоматизацией я занимаюсь не в рабочее время, а в свободное (спросить кого то некого) и сижу с этим вопросом уже больше недели, никак сам не соображу что то. Буду признателен если кто то поможет разобраться) Я предполагаю что как то не так передаю драйвер во вторую фикстуру (первая поднимает драйвер, вторая а что должна создавать запись в таблице), но как надо хоть убей не пойму, а таких фикстур мне предстоит сделать ещё несколько и они бы сильно сэкономили время прохождения тестов и время их написания. Ну и конечно же самому очень хочется разобраться что же я делаю не так.

 

conftest.py

import pytest
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

from MyTests.testData import CreateTestData

@pytest.fixture(params=["chrome"], scope='class')
def init_driver(request):
    if request.param == "chrome":
        web_driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())
    request.cls.driver = web_driver
    yield
    web_driver.close()

@pytest.fixture(scope='session', autouse=False)
def createShipment():
    create = CreateTestData()
    create.creatingConstruction()
    yield
    # sign_up_page.deleteConstruction()

testData.py (тут и выскакивает ошибка в self.elDoLoginPage = DoLoginPage(self.driver) # doLoginPage/страница логина)

from MyTests.test_base import BaseTest
from Pages.doLoginPage import DoLoginPage
from Pages.registerOfConstructionsPage import RegisterOfConstructionsPage


class CreateTestData(BaseTest):

    def creatingConstruction(self):
        # элементы страниц
        self.elDoLoginPage = DoLoginPage(self.driver)  # doLoginPage/страница логина
        self.elRegisterOfConstructionsPage = RegisterOfConstructionsPage(self.driver)  # registerOfConstructions/реестр строек
        # ____________________________________________________________________________________________#
        title = self.elDoLoginPage.get_title("Адепт: Исполнительная документация")
        assert "Адепт: Исполнительная документация" in title
        self.elDoLoginPage.do_login("autotest\\kogan", "abc123")
        self.elRegisterOfConstructionsPage.do_new_construction("Стройка 1") # создаем стройку 

test_basy.py

import pytest

@pytest.mark.usefixtures("init_driver")
class BaseTest:
    pass

BaseApp.py

from Config.config import TestData
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class BasePage:

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

    def do_click(self, locator, time=10):
        WebDriverWait(self.driver, time).until(EC.visibility_of_element_located(locator),
                                                      message=f"Не нашел куда нажать. Адрес: {locator}").click()

    def do_send_keys(self, locator, text, time=10):
        WebDriverWait(self.driver, time).until(EC.visibility_of_element_located(locator),
                                                      message=f"Не нашел куда написать. Адрес: {locator}").send_keys(text)

doLoginPage.py

from selenium.webdriver.common.by import By
from Config.config import TestData
from BaseApp import BasePage

# Локатор страницы логина
class LocDoLoginPage:
    # Локатор страницы логина
    loginField = (By.ID, 'username')
    passwordField = (By.ID, 'password')
    enterButton = (By.ID, "signin")  # кнопка войти
# объекты страницы логина
class DoLoginPage(BasePage):
    # иницилизируем вебдрайвер
    def __init__(self, driver):
        super().__init__(driver)
        self.driver.get(TestData.STABLE_URL)

    def do_login(self, username, password):     # авторизация
        self.do_send_keys(LocDoLoginPage.loginField, username)
        self.do_send_keys(LocDoLoginPage.passwordField, password)
        return self.do_click(LocDoLoginPage.enterButton)

registerOfConstructionsPage.py

from selenium.webdriver.common.by import By

from BaseApp import BasePage

# локаторы реестра строек
class LocRegisterOfConstructions:
    createNewButton = (By.XPATH, "//div[@class='dropdown ng-scope']/span[@class='dropspan btn-add button-border']") # кнопка "+"
    createConstructionButton = (By.XPATH, "//input[@type='button'][@value='Создать cтройку']") # кнопка "Создать стройку"

    #_____Окно создания новой стройки_____
    shortNameConstructionField = (By.XPATH, "//*[@ng-model='object.short_name']") # поле "Краткое наиименвоание стройки"
    saveButton = (By.XPATH, "//input[@type='button'][@value='Сохранить']") # кнопка "Сохранить"

    yesButton = (By.XPATH, "//input[@type='button'][@value='Да']")  # кнопка "Да"
# объекты реестра строек
class RegisterOfConstructionsPage(BasePage):
    def do_new_construction(self, nameOfConstruction):
        self.do_click(LocRegisterOfConstructions.createNewButton)
        self.do_click(LocRegisterOfConstructions.createConstructionButton)
        self.do_send_keys(LocRegisterOfConstructions.shortNameConstructionField, nameOfConstruction)
        self.do_click(LocRegisterOfConstructions.saveButton)

test_Act.py

..... тут еще много импортов


from MyTests.test_base import BaseTest

@pytest.mark.usefixtures("createShipment")
class Test_ActOfEntranceControlQualities(BaseTest):
    @allure.title('Акт входного контроля')
    @allure.testcase("https://1drv.ms/x/s!ApoVqwmTh8d9iSBoBQygRLKQIrGb?e=c8uSZ1", 'Тест создания и заполнения акта "Акт входного контроля качества" по поставке')
    @allure.severity(Severity.BLOCKER)
    def test_creatingAndCompletingActOfEntranceControlByShipment(self):

        self.elMainHeaderPage = MainHeaderPage(self.driver)  # MainHeaderPage/главный хедер
        self.elConstructionHeaderPage = ConstructionHeaderPage(self.driver)  # ConstructionHeaderPage/хедер стройки

        # элементы страниц
        self.elDoLoginPage = DoLoginPage(self.driver) # doLoginPage/страница логина
        self.elRegisterOfConstructionsPage = RegisterOfConstructionsPage(self.driver) # registerOfConstructions/реестр строек

.....дальше много строк теста

  • 0

#2 RoenEr

RoenEr

    Новый участник

  • Members
  • Pip
  • 6 сообщений
  • ФИО:Коган Дмитрий

Отправлено 17 апреля 2021 - 08:04

Спасибо всем кто потратил время на прочтение) Решение нашел сам, как обычно это бывает буквально через день после открытия темы. 


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных