Локаторы и объектная модель страницы

Я хочу использовать локаторы драматургов в объектах моей страницы. Я нашел пример для Javascript (раздетый для краткости):

      import { Page } from '@playwright/test';

export class TodoPage {
  listItems = this.page.locator('.todo-list li');

  constructor(public readonly page: Page) { }
}

Попытка сделать то же самое в моем коде Java:

      public class LoginPage {

    private Page page;

    private Locator loginButton = this.page.locator("#loginButton");

    public LoginPage(Page page){
        this.page = page;
    }
}

выдает исключение нулевого указателя, потому что page еще не запущен, при инициализации loginButton.

я мог бы сделать

      private Locator loginButton;

public LoginPage(Page page){
    this.page = page;

    loginButton =  this.page.locator("#loginButton");
}

но это станет довольно длинным/беспорядочным для больших классов объектов страницы.

Любые идеи о том, как это сделать в Java?

Спасибо!

3 ответа

Вы можете поместить определение локатора внутри конструктора:

      public class LoginPage {

    private Page page;
    private Locator loginButton;

    public LoginPage(Page page){
        this.page = page;
        this.loginButton = this.page.locator("#loginButton");
    }
}

Следуйте документам объектной модели страницы Playwright здесь: https://playwright.dev/java/docs/pom.

Ваша установка может выглядеть примерно так:

      public final class LoginPage {
    private final Page page;
    private final Locator loginButton;

    public LoginPage(Page page) {
        this.page = page;
        this.loginButton = page.locator("#loginButton");
    }

    public void clickLoginButton() {
        loginButton.click();
    }
}

public class TestClass {
    Page page;
    Login login;

    @BeforeEach
    void setup() {
        Browser browser = Playwright.create().chromium().launch();
        new BrowserType.LaunchOptions().setHeadless(false);
        page = browser.newPage();
        login = new Login(page);
    }

    @Test
    public void whatever() {
        login.clickLoginButton();
    }
}

Хотя я бы рекомендовал не разбивать отдельные элементы на вашей странице на отдельные локаторы. Они добавляют огромное количество ненужного ввода, я бы оставил локаторы в пределах границ рассматриваемого метода, например:

      public void clickLoginButton() {
    page.locator("#loginButton").click();
}

и тогда у вас не будет столько настроек.

Я мог бы создать класс Locator:

      public class LoginPageLocators {

    public Locator LoginButton;

    public LoginPageLocators(Page page) {
        LoginButton = page.locator("#loginButton");
    }
}

А затем получите доступ к локаторам в классе объектов страницы, например, через locators.LoginButton.click().

Это не позволило бы избежать неуклюжести / беспорядка, но, по крайней мере, скрыло бы это от класса объекта страницы.

Другие вопросы по тегам