Локаторы и объектная модель страницы
Я хочу использовать локаторы драматургов в объектах моей страницы. Я нашел пример для 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()
.
Это не позволило бы избежать неуклюжести / беспорядка, но, по крайней мере, скрыло бы это от класса объекта страницы.