Selenium/Python. Как сделать авторизацию для каждого теста?

Добрый день, я в автоматизации новичок и пытаюсь разобраться как быть с авторизацией пользователя в тестах. Насколько я понял лучше запускать браузер для каждого отдельного теста (пните если не так) и поэтому мне приходится писать несколько одинаковых строк в каждом тесте чтобы залогиниться.

def test_user_can_open_page(browser):
    page = LoginPage(browser, auth_url) # перехожу по url с логином и паролем, базовая аутентификация
    page = LoginPage(browser, login_url) # приходится переходить ещё раз на базовый url иначе потом не принимает логин и пароль
    page.do_login() # ввод логина и пароля пользователя 
    //остальные методы

Как сделать чтобы пользователь логинился автоматом перед каждым тестом? Или чтобы данные авторизации сохранялись для остальных тестов. Направьте хотя бы в правильную сторону.

Так, поехали по частям, начнём с архитектуры. Умные дяди говорят что программист (а автоматизатор тоже отчасти программист) должен быть ленив. Если есть какой-то код который выполняется более одного раза, хорошей практикой будет вынести его в отдельный метод, чтобы два раза написать не три строчки кода (а то это уже 6 строчек), а две (2х1=2).
Поэтому:

вот это вот всё выкидываем в отдельный метод: типа

def login_bitch_do_you_authorize_it(browser):
    page = LoginPage(browser, auth_url) # перехожу по url с логином и паролем, базовая аутентификация
    page = LoginPage(browser, login_url) # приходится переходить ещё раз на базовый url иначе потом не принимает логин и пароль
    page.do_login() # ввод логина и пароля пользователя 

После этой несложной махинации наш тест превращается в некое подобие:

def test_user_can_open_page(browser):
    login_bitch_do_you_authorize_it(browser)
   //остальные методы

Уже лучше, но всё равно каждый раз приходится писать:

 login_bitch_do_you_authorize_it(browser)

Хотелось бы ещё ленивее, для этого в ручном тестировании есть т.н. прекондишны, а в пайтоне фикстуры, подробнее здесь: Фикстуры pytest: явные, модальные, расширяемые — pytest: документация

3 лайка

спросите у разработчиков, нужно ли логиниться каждый раз, или можно сгенерировать аутентификационный токен и класть его в браузер, чтобы не приходилось вообще выполнять вход, тем более он у вас сломанный какой-то, что нужно несколько раз по одной и той же странице переходить

4 лайка

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

constants.py

PASSWORD = ‘Testpass1123’

Login_Pages.php

def register_new_user(self, i_password=‘Testpass1123’):
self._browser.find_element(*LoginPageLocators.REGISTRATION_EMAIL_FIELD).send_keys(str(random.getrandbits(25)) +
@fake-email.org”)
self.write_field(*LoginPageLocators.REGISTRATION_PASSWORD_FIELD, i_password)
self.write_field(*LoginPageLocators.REGISTRATION_CONFIRM_PASSWORD_FIELD, i_password)
self.click(*LoginPageLocators.REGISTRATION_BUTTON)
assert self.is_element_present(*LoginPageLocators.REGISTRATION_COMPLETE_MESSAGE),
“Registration message is not presented”

@allure.step('Register new user with not valid email')
def register_new_user_with_not_valid_email(self, i_email='not-valid-email.org', i_password='Test-pass1123'):
    self.write_field(*LoginPageLocators.REGISTRATION_EMAIL_FIELD, i_email)
    self.write_field(*LoginPageLocators.REGISTRATION_PASSWORD_FIELD, i_password)
    self.write_field(*LoginPageLocators.REGISTRATION_CONFIRM_PASSWORD_FIELD, i_password)
    self.click(*LoginPageLocators.REGISTRATION_BUTTON)
    assert not self.is_element_present(*LoginPageLocators.REGISTRATION_COMPLETE_MESSAGE), \
        "Whoops! Registration message presented"

Создайте фикстуру setup которая будет логинить пользователя перед каждым тестом.
@pytest.fixture(scope=“function”, autouse=True)
def setup(browser):

1 лайк