Вам не нужно автоматизировать все страницы или захватывать все объекты.Что вам нужно сделать, это захватить все, что требуется для ваших тестов.Модель Page Object
предназначена для минимизации фактора «изменения» в вашей тестовой среде и, таким образом, минимизирует объем работы, который потребуется для применения любых изменений в будущем.
Если вы используете PageFactory
Вам не нужно писать driver.findElement(By.(...)).click()
для каждого из элементов.Вместо этого ваш код может выглядеть следующим образом:
public class SomePage {
@FindBy(id = "some_id");
private WebElement button;
private WebDriver driver;
public SomePage(WebDriver driver) {
this.driver = driver;
}
public SomePage clickButton() {
button.click();
return this;
}
public String getTitle() {
return driver.getTitle();
}
}
Таким образом, вам не нужен класс super
с каким-то необычным click
методом.Это, конечно, если поведение click
по умолчанию вам подходит.Если вы хотите ввести wait
, Actions
и так далее, не стесняйтесь создавать метод в суперклассе, который будет делать именно это.Затем конструктор базового класса вызовет super(driver)
, а суперкласс должен будет выполнить метод PageFactory.initElements(driver, this)
.Таким образом, ваш код хотел бы что-то вроде этого:
public class BasePage {
private WebDriver driver;
protected BasePage(WebDriver driver) {
this.driver = driver;
}
protected void superClick(By elementLocator) {
WebDriverWait wait = new WebDriverWait(driver, 10);
wdWait.until(ExpectedConditions
.presenceOfElementLocated(By.cssSelector("selector"))).click();
}
}
public class SomePage extends BasePage{
private static final By button = By.cssSelector("some_selector");
private WebDriver driver;
public SomePage(WebDriver driver) {
super(driver);
this.driver = driver;
}
public SomePage clickButton() {
superClick(button);
return this;
}
public String getTitle() {
return driver.getTitle();
}
}
Ожидание является лишь примером для объяснения общей идеи.
РЕДАКТИРОВАТЬ
СPageFactory
не следует использовать согласно комментариям и этому ответу: Почему следует избегать Page Factory Я отредактировал свой ответ.Я оставляю здесь оба примера и решение о том, как он хочет перейти к ОП.
Так или иначе, чего вы хотите достичь в итоге, это method chaining
.Таким образом, ваш тест читабелен, может быть хорошим примером «одного теста одно утверждение» и будет выглядеть примерно так:
assertEquals("Title does not match.",
expectedTitle, new LoginPage(driver)
.openLoginPage()
.login(user)
.openSomePage()
.clickButton()
.getTitle());