×

Selenium + Selenide +JUnit + Java + Page Object = Вопрос

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Всем доброго времени суток. Есть несколько вопросов по написанию 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. Критика, пожелания и предложения приветствуются.

Заранее спасибо всем откликнувшимся.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Login loginAsMainAdmin = new Login();
loginAsMainAdmin = loginAsMainAdmin();

что это за дичь? Ты создал два обекта

Мда... где ты такой пейджобжджект видел? Погугли и посмотри как нормальные люди делают.

Примеры были найдены в гугле...
По запросу «пейджобжект нормальных людей» ничего не нашел, если не сложно — дайте ссылку на правильные пейджобжекты, заранее спасибо.

Регистрируйся тут: software-testers.herokuapp.com
Слак чат тестеров СНГ, там есть спецаильные чаты для таких вопросов к примеру #selenide #automaion #code-review
Поможем, расскажем тосё)

Ща охотники будут регаться =)

Вопрос не для DOU. За такими советами нужно писат на automated-testing.info или в slack чат

А каковы критерии «не для DOU»?
Я знаю только один критерий — когда нет представителей нужной аудитории. Если шансы есть — почему бы и нет. Чем оно хуже рекламы CowWorking — подавлов?

А теперь сам тест:
onDashboardPage.menu().shouldHaveSize(12).shouldHave(CollectionCondition.texts( «some text»));

Перевірки в середині PO ?
не знаю навіть. ІМХО — таке не подобається. Якось правельніше мати перевірки в тілі тест кейса.

System.out.println("Dashboard page is present !)");

Також сумнівний вивід.
Краще пиши логи в log4j.

Зараз: В PO повертаю элементи і коллекції, а в самому тест кейсі — перевіряю текст і кількість елементів...
Потрібно: В PO тільки відкривати сторінку, а в тілі самого тест кейса знаходити елемент і перевіряти його — правильно?
З приводу логів зрозумів.

В PO
відкривати сторінку
знаходити елемент
, а в тілі самого тест кейса
перевіряти його
public class DashboardPage extends Login

как то 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 в який передається потрібний юзер?

так.
залежність між тестами погана штука, не зможете нормально оцінити результати

тдельно package с PageObject-ами для роли администратора

POM не має залежати від юзера. дублюєте код. не простіше передавати юзера в метод логін ?

Підписатись на коментарі