Selenium + Selenide +JUnit + Java + Page Object = Вопрос
Всем доброго времени суток. Есть несколько вопросов по написанию UI автотестов с Selenide.
Дано:
— Back End портал. На котором есть несколько ролей пользователей (к примеру: главный администратор, и администратор).
— Selenium + Selenide +JUnit + Java + Intellij IDEA(Maven)
— 1 начинающий тестировщик.
— 20 автотестов, которые предположительно независимы друг от друга, но что-то мне подсказывает, что моя реализация не особо правильная...
Ожидаемый результат:
— Выстроить правильную архитектуру проэкта, чтобы в дальнейшем если и менять что-то — то по минимуму.
— Сделать автотесты поддерживаемымы и независимыми.
Есть класс для логина:
public class Login {
public Login loginAsMainAdmin(){
open("http://");
$(By.xpath(".//*[@id='loginform-email']")).setValue("some_email");
$(By.xpath(".//*[@id='loginform-password']")).setValue("some_password");
$(By.xpath(".//*[@id='login-form']/button")).pressEnter();
return new Login();
}
Он используется каждый раз при начале нового теста из тест сьюита.
Есть package с PageObject -ами для всез страниц, к примеру главная:
public class DashboardPage extends Login {
public DashboardPage() {
// Логин под главным администратором
Login loginAsMainAdmin = new Login();
loginAsMainAdmin = loginAsMainAdmin();
}
public String getDashboardElements(){
return $(By.xpath("html/body/div[1]/div[2]/div/ul/li[2]/a/span[2]")).getText();
}
public ElementsCollection menu(){
return $$("li.start");
}
Проверок пока минимум, возвращаю имя залогиненного пользователя, и элементы меню. Далее в тестах проверяю количество и совпадение текста.
Подготовка к тесту:
@Before
public void testSetUp (){
//CHROME Browser
Configuration.browser = "chrome";
System.setProperty("webdriver.chrome.driver", "D:\\webdriver\\chromedriver_win32\\chromedriver.exe");
System.setProperty("selenide.browser", "Chrome");
//FIREFOX Browser
//SAFARI Browser
//IE Browser
//EDGE Browser
}
@After
public void testShutDown (){
WebDriverRunner.clearBrowserCache();
}
Запускаю Хром и в конце каждого теста — чищу кэш.
А теперь сам тест:
@Test
public void DashboardTest (){
DashboardPage onDashboardPage = new DashboardPage();
onDashboardPage.getDashboardElements().contains("Admin");
onDashboardPage.menu().shouldHaveSize(12).shouldHave(CollectionCondition.texts( "some text"));
System.out.println("Dashboard page is present !)");
}
Под разными ролями (главный администратор, администратор) — некоторые страници сузествуют только под одной из ролей, остальные немного отличаются друг от друга, и соответственно xpath у элементов меняется, в зависимости от роли.
А теперь вопросы:
1. Мне кажется неправильным в каждом тесте логиниться (сделал это для независимого запуска) , подскажите, есть ли более правильное решение.
2. Нужно ли создавать отдельно package с PageObject-ами для роли администратора, или можно добавить в каждый PageObject проверку, чтобы знать из какого тест сьюита запускается тест и возвращать элементы по необходимому xpath-у, не приведет ли это к усложнению поддерживаемости?
3. Как улучшить имеюзуюся архитектуру («архитектура» — довольно громко звучит... не ругайте сильно...)?
4. Стоит ли использовать JUnit или переходить на TestNG, будут ли преимущества? И насколько это оправдано на данном этапе?
5. Нужно ли проверять верстку скриншотами (верстка портала еще не доведена до конца)?
6. Критика, пожелания и предложения приветствуются.
Заранее спасибо всем откликнувшимся.
24 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарівчто это за дичь? Ты создал два обекта
Мда... где ты такой пейджобжджект видел? Погугли и посмотри как нормальные люди делают.
Примеры были найдены в гугле...
По запросу «пейджобжект нормальных людей» ничего не нашел, если не сложно — дайте ссылку на правильные пейджобжекты, заранее спасибо.
github.com
-
Регистрируйся тут: software-testers.herokuapp.com
Слак чат тестеров СНГ, там есть спецаильные чаты для таких вопросов к примеру #selenide #automaion #code-review
Поможем, расскажем тосё)
Ща охотники будут регаться =)
щит.. и удалить не как(
Вопрос не для DOU. За такими советами нужно писат на automated-testing.info или в slack чат
А каковы критерии «не для DOU»?
Я знаю только один критерий — когда нет представителей нужной аудитории. Если шансы есть — почему бы и нет. Чем оно хуже рекламы CowWorking — подавлов?
Перевірки в середині PO ?
не знаю навіть. ІМХО — таке не подобається. Якось правельніше мати перевірки в тілі тест кейса.
Також сумнівний вивід.
Краще пиши логи в log4j.
Зараз: В PO повертаю элементи і коллекції, а в самому тест кейсі — перевіряю текст і кількість елементів...
Потрібно: В PO тільки відкривати сторінку, а в тілі самого тест кейса знаходити елемент і перевіряти його — правильно?
З приводу логів зрозумів.
как то DashboardPage не есть Login как по мне.
Xpath желательно по классам или id.
Если часто к полям обращаешся можно запихнуть это дело в поля класса и повесить аннотацию @FindBy
Может предложите вариант, как по другому залогинится, не писать же в каждом PageObject полностью вход на сайт, а так я вынес его в Login и юзаю 2 строчки...
Просто сделай композицию. Можно ведь сделать new Login().doLogin(); ?
Якщо в тебе є окремий метод для кожного типу логування (loginAsMainAdmin, loginAsUser і т.д.) ти можеш в цих методах повертати відразу пейдж обжект тої сторінки, на яку потрапляє юзер після успішного логіну.
Наприклад:
public class Login{ public AdminPage loginAsMainAdmin(){ performLogin("username", "password"); return new AdminPage(); } public HomePage loginAsUser(){ performLogin("username", "password"); return new HomePage(); } private void performLogin(String username, String password){ open("http://"); $(By.xpath(".//*[@id='loginform-email']")).setValue(username); $(By.xpath(".//*[@id='loginform-password']")).setValue(password); $(By.xpath(".//*[@id='login-form']/button")).pressEnter(); } }Але креденшали краще кудись винести в файл або змінну середовища.1. Используй maven или gradle
2. Не пиши xpath с абсолютными путями
Maven использую, по xpath-ам понял, спасибо.
А якщо тест1 впаде, а тест2 буде очікувати вже піднятого браузера після тест1 ?
Маєте на увазі, що потрібно запускати браузер окремо для кожного тесту, і потім заходити на портал за допомогою Login в який передається потрібний юзер?
так.
залежність між тестами погана штука, не зможете нормально оцінити результати
Дякую, виправлю...
POM не має залежати від юзера. дублюєте код. не простіше передавати юзера в метод логін ?