Добрый день. Подскажите как реализовать метод который в зависимости от других факторов может возвращать разные страници:
Например метод clickButtonSubmitLogin -
Если данные валидные возвращаем объект класа “Личний кабинет”, если не валидные - остаемся на текущей странице. Еще можно добавить например если введенные данные - пароль и логин для администратора - переадресация в админ часть (думаю примеров можно еще много добавить).
Интересует именно возможность сделать это одним методом
Вы не должны угадывать, какая из страниц будет показана. Вы должны знать точно - если юзер залогинился под таким-то именем - он должен увидеть такую-то страницу. Иначе тест фейлится.
к примеру, есть метод который авторизируется на сайте:
public class SomeAuthorizationDSL
{
public WelcomePage Login(string username, string password)
{
...
var welcomePage = loginPage.
FillLoginForm(username, password).
Submit();
Assert.AreEqual(true, welcomePage.IsOpened(), "Не удалось открыть страницу продукта после авторизации");
...
}
}
welcomePage это PageObject, у которого в конструкторе задан уникальный для этой страницы локатор (страницы, на которую попадает пользователь в случае успешной авторизации)
public class WelcomePage : SomeBasePage
{
public WelcomePage()
{
SetPageLocator(new Label("Welcome Page", "//div[@class='l-left-menu']"));
}
...
}
метод IsOpened это Web Element is present реализованный в SomeBasePage
p.s.: Label - обертка на Web Element
@Furik_Vasil правильный ответ - это НЕ НУЖНО делать одним методом. В пэдж объекте должно быть два разных метода: один возвращает страницу А, второй возвращает страницу Б. И каждый тест сам должен знать, какой из методов вызвать.
public <T extends PageObject> T login(UserModel user, Class<T> pageToReturn) {
loginAs(user);
return PageObjectFactory.getInstanceOf(pageToReturn);
}
where method ‘loginAs’ performs entering data into a login form and submits, and ‘PageObjectFactory.getInstance’ return a new object of a desired page.
For safery, if all your pages extend some ‘PageObject’ class, you may include restrictions on the generic type by <T extends PageObject>.
In any case, in a test script you must know for sure which page is to be returned on the basis of the ‘user’ provided, otherwise the test should fail.
Я поддерживаю @asolntsev, т.к. Вы должны проверить реакцию системы на переданный параметр/условие.
Проектируя тест, вы должны понимать какая страница Вам вернется при каком-то условии. И проверить что вернулась именно та страница ,которую вы ждете, иначе - это ошибка.
Придерживайтесь принципа KISS(Keep it short and simple) и будет счастье
Надо или не надо так делать - скорее холиварный вопрос. Каждый решает для себя сам. Я в некоторых местах использую дженерики и это помогает избежать лишнего кода. Например хелпер для метода refresh страницы.
public class PageUtils {
public static <T> T refreshPage(Class<T> page) {
logger.info("refreshing page " + page.getSimpleName());
Selenide.refresh();
return Selenide.page(page);
}
}
Сам pageObject в кострукторе при инициализации обеспечивает проверку, что это именно ожидаемая страница а не какая-то другая. Работает безотказно. Тест упадёт, если открылась не та страница, которую мы ожидали.