Добрый день. Начинаю писать автотесты на 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/реестр строек .....дальше много строк теста