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

Всем привет, нужна ваша помощь. Сейчас изучаю 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());
    }
}

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

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

2 лайка

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

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

PageFactory.initElements(driver, this)

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

не работает

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());
    }
}

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

1 лайк

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

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

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

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

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

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

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

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