Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Есть ли возможность в базовом классе инициировать объекты PageFactory из дочерних классов


(Galina.Bratchik) #1

Добрый день!

У меня такая ситуация: есть несколько страниц, они все разные, но имеют какой-то одинаковый функционал. Скажем, логин. 

Есть ли возможность построить иерархию классов в этом случае? Я хочу указывать локаторы в каждом конерктном классе, а методы, использующие эти элементы, описать в базовом.

Что-то вроде этого:

{syntaxhighlighter brush:java;}public class BasePage { WebElement loginField; WebElement passwordField; WebElement loginButton;

public void login() { 
    loginField.sendKeys(login); 
    passwordField.sendKeys(password); 
    loginButton.click(); 
} 

}

public class Page1 extends BasePage {
@FindBy(id = “email1”)
WebElement loginField;

@FindBy(id = "password1") 
WebElement passwordField; 

@FindBy(id = "button1") 
WebElement loginButton; 

}

public class Page2 extends BasePage {
@FindBy(id = “email2”)
WebElement loginField;

@FindBy(id = "password2") 
WebElement passwordField; 

@FindBy(id = "button2") 
WebElement loginButton; 

}

public class MyTest {
@Test
public void test() {
BasePage page = new Page1();
page.login();
page = new Page2();
page.login();
}
} {/syntaxhighlighter}


(Дмитрий Жарий) #2

 

UPD, чет я совсем не в тему ответил.  

Привет Галина, 
Конкретного примера в Java у меня нет, но я такую штуку делал в C#. Тут все очень зависит от того, как реализована PageFactory внутри. На C# используется Castle DynamicProxy, и эта библиотека позволяет осуществить подход, описанный выше. 
 
Для начала, и для удобства можно вынести веб браузер в отдельный статический класс. 
Эта тема обсуждалась тут:
http://automated-testing.info/forum/how-run-new-test-same-window-there-another-test-was-completed
 
А вот моя реализация:
http://git.io/ENS8mQ
 
 
У меня экземпляр текущего вебдрайвера можно получить через:
WebBrowser.Driver
 
В этом случае, я поместил инициализацию в конструктор базового класса(AbstractPageBase), который в C# выполняется автоматически при создании любого дочернего класса. 
http://git.io/Wckvmw
 
И есть страница LoginPage, которая содержит лишь декларации элементов. При создании  экземпляра LoginPage – конструктор базового класса и инициализация пейджобжекта будет выполнена автоматически. 
http://git.io/7DO4SA

(barancev) #3

Согласно правилам Java, в дочерних классах Вы таким образом декларируете новые поля, "перегрузки полей" не существует.

Зато по прежнему доступна перегрузка методов, поэтому можно сделать так:

public abstract class BasePage { 
abstract public WebElement getLoginField(); 
abstract public WebElement getPasswordField(); 
abstract public WebElement getLoginButton(); 

public void login() { 
    getLoginField().sendKeys(login); 
    getPasswordField().sendKeys(password); 
    getLoginButton().click(); 
} 

}

public class Page1 extends BasePage {

@FindBy(id = "email1") 
WebElement loginField; 

@FindBy(id = "password1") 
WebElement passwordField; 

@FindBy(id = "button1") 
WebElement loginButton; 

public WebElement getLoginField() {
    return loginField;
}

public WebElement getPasswordField() {
    return passwordField;
}

public WebElement getLoginButton() {
    return loginButton;
}

}

public class Page2 extends BasePage {

@FindBy(id = "email2") 
WebElement loginField; 

@FindBy(id = "password2") 
WebElement passwordField; 

@FindBy(id = "button2") 
WebElement loginButton; 

public WebElement getLoginField() {
    return loginField;
}

public WebElement getPasswordField() {
    return passwordField;
}

public WebElement getLoginButton() {
    return loginButton;
}

}

public class MyTest {

@Test 
public void test() { 
    BasePage page = new Page1(); 
    page.login(); 
    page = new Page2(); 
    page.login(); 
} 

}


(Galina.Bratchik) #4

Спасибо! Все сработало :)