Всем еще раз привет! Вот тут http://software-test...-nasledovaniia/ я создавал тему касающейся правильности создания архитектуры Page Object. Мне указали на мои ошибки, и я начал гуглить и искать информацию по их устранению.
И так:
Архитектура классов тут: https://www.screenca...om/t/uUoP0S0wN7
Пока что реализовал вот как:
Создал класс BaseTest, в котором у меня реализована инициализация драйвера, также убрал SetProperty с явным указанием в нем пути к драйверу заменив его dependency WebDriverManager в pom файле. В итоге получился такой код:
public class BaseTest { protected WebDriver driver; @BeforeClass public void setUpDriver(){ WebDriverManager.chromedriver().setup(); driver = new ChromeDriver(); } @AfterClass public void tearDown(){ driver.quit(); } }
От этого класса у меня будут наследоваться все тестовые классы.
Дальше создал класс BasePage, от которого будут наследоваться все пейджы. Так как пейджам нужен драйвер, то в данном классе (BasePage) я создал конструктор, в итоге каждый пейдж который будет создаваться, получит драйвер через super(driver).
Также я тут создал метод find, который заменит длинное написание driver.findElement().
Код ниже:
public class BasePage { protected WebDriver driver; public BasePage(WebDriver driver){ this.driver = driver; } public WebElement find(By locator){ return driver.findElement(locator); } }
Дальше класс самой страницы. Тут я оставил пару методов просто для наглядности, что бы не копипастить весь класс. В итоге создаем конструктор страницы, получаем драйвер, создаем переменные типа By с которыми будем работать, создаем маленькие методы (например заполнить поле, выбрать с селекта), потом создаем метод cardFill() который обьеденит эти методы.
public class NewOrgRegistrationPage extends BasePage{ public NewOrgRegistrationPage(WebDriver driver) { super(driver); } String url = "http://192.168.1.111:8085/share/page/context/mine/sxg-external-registration"; By orgRegistrationReasonDropBox = By.name("prop_uxp_orgnRegistrationReason"); By fullOrgNameField = By.name("prop_uxp_orgnName"); public NewOrgRegistrationPage selectOrgRegistrationReason(){ Select selectOrg = new Select(find(orgRegistrationReasonDropBox)); selectOrg.selectByIndex(1); return this; } public NewOrgRegistrationPage setFullOrgNameField(String orgName){ find(fullOrgNameField).sendKeys(orgName); return this; } public NewOrgRegistrationPage visit(){ driver.get(this.url); return this; } public void cardFill(){ visit(); selectOrgRegistrationReason(); setFullOrgNameField("some name"); } }
И наконец то сам тест класс
public class CreatingNewOrgTest extends BaseTest{ @Test public void cardFill(){ NewOrgRegistrationPage page = new NewOrgRegistrationPage(driver); page.cardFill(); } }
Жду конструктивной критики особенно от пользователя Noksa, так как прошлый раз очень хорошие были замечания.
Но помимо критики у меня сразу есть вопросы.
1. Мне кажется что в тестовых классах я не должен иметь возможности делать driver.findElement, driver.click и т.д. Тоесть на прямую обращаться к драйверу. Или я ошибаюсь?
2. В архитектуре классов у меня есть также класс SummaryAPI. В лекции что я смотрел, от этого класса неследовались классы BasePage и BaseTest - тоесть в них была реализация чего то общего для этих двух классов, например того же метода find:
public WebElement find(By locator){ return driver.findElement(locator); }
Я этого к сожелению понять не могу, зачем мне этод метод в тестовых классах? Если я могу его создать в BasePage, что я собстевнно и сделал, так как только в пейджах которые наследуються от этого класса я и буду его использовать. В чем смысл заносить его в SummaryAPI, потом наследовать в BaseTest и в тестовом методе иметь возможность делать find(By name("q")).
Я много где видел советы по созданию класса общего для BasePage и BaseTest. Но что там должно быть? Наведите пожалуйста примеры. Спасибо!