Пытаюсь автоматизировать веб-приложение с помощью Selenium WebDriver + Pytest.
Проблема такая: в проекте имеется несколько различных ролевых моделей пользователей (например, админ, модератор, пользователь и тд), которым, соответственно, доступен различный функционал. Авторизация выполняется при инициализации браузера. Однако такая архитектура предполагает прогон теста только под одной ролевой моделью (например, админом), для прогона под другой ролевой моделью (например, модератором) нужно вручную менять данные для авторизации, что в условиях запуска и прогона тестов на CI становится невозможным.
С другой стороны, можно было бы выполнять авторизацию (или проверку на то, что авторизован нужный пользователь) в каждом тестовом наборе, но копипастить код также выглядит не очень изящным решением, так как разные фичи бывают доступны разным ролевым моделям (например, и админ, и модератор могут создавать обычного пользователя). Соответственно, какие то тесты должны прогоняться для каких-то отдельных ролей, а какие-то для нескольких ролей сразу.
Вот, собственно, и вопрос, подскажите, как можно более толково разграничить прогоны тестов под разными ролями? Выполнять их последовательно или параллельно в разных окнах - особого значения не имеет.
Вот реализация авторизации (данные для авторизации берутся из файла):
fixture = None
@pytest.fixture
def driver(request, data_login):
global fixture
# проверка браузера и инициализация
if fixture is None:
fixture = Application()
else:
if not fixture.is_valid():
fixture = Application()
# проверка авторизации пользователя и авторизация
fixture.session.open_page()
fixture.session.ensure_login(data_login)
return fixture
Пытаюсь написать автотест: открыть браузер, открыть почту, ввести логин/пароль, войти, убедиться что вошёл в почтовый ящик. Кусок кода:
// Ввожу логин:
WebElement loginField = driver.findElement(By.id("Login"));
loginField.sendKeys("vasya_pupkin");
// Ввожу пароль:
WebElement passwordField = driver.findElement(By.id("Pswd"));
passwordField.sendKeys("qwerty12345");
// Жму кнопку Войти:
WebElement loginButton = driver.findElement(By.cssSelector(".button__content"));
loginButton.click();
// Убеждаюсь что попал в свой почтовый ящик:
WebElement profileUser = driver.findElement(By.cssSelector(".login-button__user"));
String mailUser = profileUser.getText();
Assert.assertEquals("vasya_pupkin@mail.ru", mailUser);
Но я не могу разобраться: там перед тем как войти надо поставить галку "Я не робот" и потом выбрать какие-нибудь картинки (например картинки где изображен дорожный знак). А так как в тесте я это не отразил то на странице авторизации появляется сообщение "Пройдите проверку Я не робот", а сам тест падает. Как это в коде изобразить?
Можно ли использовать уже существующий объект Selenium WebDriver? Я имею в виду следующее: в первом тесте я создаю этот объект, а по его окончанию не закрываю и не уничтожаю. После окончания теста процесс продолжает оставаться в памяти. Через какое-то время у меня возникает потребность запустить другой тест, в котором используется тот же URL. Могу ли я каким-то образом в этом новом тесте использовать старый объект драйвера, активировать существующее окно браузера и выполнить в нем новый тест?