t.me/atinfo_chat Telegram группа по автоматизации тестирования

Selenoid не работает @FindBy Page Object

page-factory
infrastructure
page-object
selenoid
selenium
webdriver
Теги: #<Tag:0x00007f21d6d7a0b0> #<Tag:0x00007f21d6d79f48> #<Tag:0x00007f21d6d79e08> #<Tag:0x00007f21d6d79cc8> #<Tag:0x00007f21d6d79b88> #<Tag:0x00007f21d6d799d0>

(Vladyslav) #1

Всем привет, нужна ваша помощь. Сейчас изучаю Page Object и столкнулся с проблемой Page Factory. Не работает @FindBy, error: [NullPointerException] код следующий:

public class BasePage {

    protected static WebDriver driver;

    public static WebDriver getDriver() {
        return driver;
    }

    public static void setUp() throws MalformedURLException {

        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setBrowserName("chrome");
        capabilities.setVersion("75.0");
        capabilities.setCapability("enableVNC", true);
        capabilities.setCapability("enableVideo", false);

        driver = new RemoteWebDriver(
                URI.create("http://127.0.0.1:4444/wd/hub").toURL(),
                capabilities
        );
    }
}
public class GoogleHomePage {

    @FindBy(how = How.LINK_TEXT, linkText = "Gmail")
    private  WebElement linkText;

    public GoogleHomePage(WebDriver driver) throws InterruptedException {
        driver.get("https://google.com");
        Thread.sleep(5000); //pause 5 second
//        driver.findElement(By.linkText("Gmail")).click();
        linkText.click();
    }
}
public class GoogleTest {

    @BeforeTest
    protected void setUp() throws MalformedURLException {
        BasePage.setUp();
    }

    @Test
    public void GoogleHome() throws InterruptedException {
        new GoogleHomePage(getDriver());
    }
}


(Sergey Korol) #2

PageFactory вы то упомянули, но добавить - не добавили. :wink:

P.S. И selenoid тут не причем.


(Vladyslav) #3

Большое спасибо за подсказку :+1: я пытался разобрать но что-то не получается у мене правильно объявить Page Factory чтобы можно было обращаться к нему с другого класса. Можете пожалуйста привести пример на моем коде как это реализовать. Заранее спасибо


(Nik Sidorenko) #4

Добавьте конструктор BasePage и в него инициализацию PageFactory

PageFactory.initElements(driver, this)

И унаследуйте GoogleHomePage от BasePage


(Vladyslav) #5

не работает

public class BasePage {

    protected static WebDriver driver;

    public static WebDriver getDriver() {
       PageFactory.initElements(driver, this)
        return driver;
    }

    public static void setUp() throws MalformedURLException {

        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setBrowserName("chrome");
        capabilities.setVersion("75.0");
        capabilities.setCapability("enableVNC", true);
        capabilities.setCapability("enableVideo", false);

        driver = new RemoteWebDriver(
                URI.create("http://127.0.0.1:4444/wd/hub").toURL(),
                capabilities
        );
    }
}
public class GoogleHomePag extends BasePage {

    @FindBy(how = How.LINK_TEXT, linkText = "Gmail")
    private  WebElement linkText;

    public GoogleHomePage(WebDriver driver) throws InterruptedException {
        driver.get("https://google.com");
        Thread.sleep(5000); //pause 5 second
//        driver.findElement(By.linkText("Gmail")).click();
        linkText.click();
    }
}
public class GoogleTest {

    @BeforeTest
    protected void setUp() throws MalformedURLException {
        BasePage.setUp();
    }

    @Test
    public void GoogleHome() throws InterruptedException {
        new GoogleHomePage(getDriver());
    }
}

(asolntsev) #6

Page object можно сделать гораздо проще, без всяких PageFactory и @FindBy:


(Vladyslav) #7

Еще больше запутался. Можете пожалуйста навести пример на моем коде…


(Nik Sidorenko) #8

Давайте по порядку

Предлагали добавить это в КОНСТРУКТОР BasePage, а Вы куда добавили?! В статический метод getDriver. А Вас не смущает наличие “this” в статическом методе?!

Далее в конструкторе GoogleHomePagе Вы пытаетесь кликнуть на ссылку. Обычно в конструкторах такое не делают.

Не до конца уверен, но TestNG вроде требует, чтобы методы с аннотацией @BeforeTest были public.

Мы могли бы написать Вам работающий код, но ведь цель “не дать рыбу, а научить её ловить”

Как у Вас с программированием? Если не очень, то подтяните сначала программирование, чтобы потом легче было с автоматизацией


(asolntsev) #9

Вот ваш пример, подпиленный напильником: