Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Проблемы с инициализацией блоков в HtmlElements

html-elements
java
Теги: #<Tag:0x00007f7b6d685f20> #<Tag:0x00007f7b6d685b38>

(Александр Шиповалов) #1

Добрый день. Коллеги, решил попробовать на проекте такую штуку как Html Elements. Собственно говоря тут и начинается, что то мистическое для (меня). Проект основан на архетипе Алексея Баранцевая
хороший архетип

Подключил в pom зависимость и тут начинается самое интересное. Как любой начинающий, решил сделать тест на логин
Описал форму авторизации

package com.block;

@Name("Authorization form")
@FindBy(id = "id='cv-travel-agent-login-form")

public class AuthorizationForm {
    @Name("Industry input")
    @FindBy(id = "edit-arc")
    public TextInput industryInput;

    @Name("Email input")
    @FindBy(id = "edit-email")
    public TextInput emailInput;

    @Name("Password input")
    @FindBy(id = "edit-passwd")
    public TextInput passwordInput;

    @Name("Get started button")
    @FindBy(id = "edit-submit")
    public Button getStartedButton;

    public void login(String industry, String email, String password) {
        industryInput.sendKeys(industry);
        emailInput.sendKeys(email);
        passwordInput.sendKeys(password);
        getStartedButton.click();
    }
}

Описал страницу логина

package com.pages;

public class LoginPage  {
    public AuthorizationForm authorizationForm;

    public LoginPage (WebDriver driver) {
        PageFactory.initElements(new HtmlElementDecorator(driver), this);
    }

    public void loginAsTA(String industry, String email, String password) {
        authorizationForm.login(industry, email, password);
    }
}

Пробую вызывать в тесте
package com.wdtests;

public class TestTAHome  {

    public LoginPage loginPage = new LoginPage(driver);

    public void id01testCase) throws InterruptedException {
        loginPage.loginAsTA("87654321" , "ashipovalov@.com" , "2014");

Летит `NullPointerException, который показывает, что форма не проинициализирована. При это браузер стартуер, файлик xlsx, в ДатаПровайдере прочитан и данные идут в тест - то есть все скомпилировалось. Может кто нибудь сталкивался с нюансами инициализации блоков в Html Elements - буду очень благодарен за помощь


(Александр Шиповалов) #2

Сам заметил первую ошибку? Добавил перед строкой

loginPage.loginAsTA("87654321" , "ashipovalov@.com" , "2014");

строку

driver.get("нужный урл");

но проблема осталась той же


(Антон) #3

Просто в форме допиши extends HtmlElement


(Александр Шиповалов) #4

Дописал, стало немного лучше. Теперь очевидно форма инициализируется, но падает на первом же TextInput

ru.yandex.qatools.htmlelements.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:48)

(Александр Шиповалов) #5

Падает на этой строчке

industryInput.sendKeys(industry);

Может быть зря я и в описании формы и в описании элементов задал id…


(Антон) #6

Не зря :slight_smile: там это не важно (но в будущем будет важно при задании xpath не забывать ставить в начале точечку, которая будет значить “искать в блоке”)
А важно объявлять страничку с HtmlElement-ами, а не обычной PageFactory

HtmlElementLoader.populatePageObject(page, driver);

Хотя у тебя и так похожая реализация :slight_smile:


(Александр Шиповалов) #7

То есть класс LoginPage должен выглядеть так:

public class LoginPage  {
    public AuthorizationForm authorizationForm;

    public LoginPage (WebDriver driver) {
        HtmlElementLoader.populatePageObject(LoginPage, driver);
    }

    public void loginAsTA(String industry, String email, String password) {
        authorizationForm.login(industry, email, password);
    }
}

Странно, я примеры брал из документации на GitHub. Хотя компилятору все равно не нравится, что LoginPage идет в параметрах…хотя это наверное странно…передавать в конструкторе ссылку на самого себя


(Антон) #8

Та да очень странно :slight_smile: Ты получается вместо экземпляра класса, который проинициализировать хочешь кидаешь в метод сам класс, а это не правильно %)
Мой кусочек не из пейджи вырван, а из PageFactory своей и в том случае page это экземпляр класса…


(Антон) #9

Да и в любом случае внутри блока не обязательно искать через аннотации.
можно через метод родителя (HtmlElement) - findElement()


(Александр Шиповалов) #10

А можно вот про это поподробнее. Что то как то негусто с доками на этот Html Elements.


(Александр Шиповалов) #11

Такая запись ему (TestNG) тоже не понравилась

  public LoginPage (WebDriver driver) {
        HtmlElementLoader.populatePageObject(authorizationForm, driver);
    }

(Александр Шиповалов) #12

Более внимательно пробежался по своему, коду - вроде бы все заработало. Спасибо за помощь.


(Sergey Korol) #13

Если вам какой-то ответ показался полезным, не забываем ставить лайки. :wink:


(Антон) #14

Пожалуйста :slight_smile: Я уж начал подозревать что пользуюсь какой-то уж очень старой версией HtmlElement-тов :smile:


(Александр Шиповалов) #15

Версия 1.12. А вот инструкция была какая то совсем древняя:
Раз уж пошла такая пьянка, и мне повезло сразу налететь на специалиста в HTML Elements. Может быть загляните сюда