Как мы можем инициализировать экземпляр веб-драйвера, не объявляя его статическим, и использовать один и тот же экземпляр во всех классах pageObjects?
public class Base
{
public WebDriver driver;
public void initializeDriver()
{
driver=new FirefoxDriver();
}
}
public class Page extends Base
{
Page(WebDriver driver)
{
this.driver=driver;
}
@Test
public void testPage()
{
driver.get("https://www.google.co.in/");
}
}
В классе страницы
Почему нам нужен конструктор в каждом классе страницы, который расширяет базовый класс. Какова цель этого конструктора и как он работает. Я запутался с использованием конструктора в классе страницы. Пожалуйста, помогите мне понять его работу здесь. Спасибо заранее..
2 ответа
Вам не нужны конструкторы в ваших классах Page. Кроме того, вы можете сделать все его методы статичными и посмотреть, как это помогает сократить количество строк кода.
Мы можем легко получить представление об объектной модели страницы, посмотрев сначала на тесты. Вот пример теста:
- перейти на страницу входа
- введите имя пользователя, пароль и нажмите кнопку [Отправить]
- дождитесь загрузки домашней страницы и проверьте там что-нибудь, например, отображаемое имя пользователя и меню [Выход из системы]
Вы можете написать множество других случаев, например, ввести неверное имя пользователя / пароль. Таким образом, вы не хотите повторять код, чтобы найти элементы, введите его или щелкните по нему. Вместо этого пишите методы в классе страницы входа. Этот класс содержит все локаторы элементов и предоставляет методы для взаимодействия с ними.
Здесь я пишу полностью статические классы Page:
public class TestBase {
public static WebDriver driver;
@BeforeMethod
public void init() {
//create the driver here
}
@AfterMethod
public void teardown() {
//quit the driver here
}
public static pause(int millis) {
//
}
}
public class LoginPage extends TestBase {
static By txtUsername = By.xpath("//form//input[@name='username']");
public static fillUsername(String username) {
WebElement e = driver.findElement(txtUsername);
e.clear();
e.sendKeys(username);
}
//other elements...
}
public class Home extends TestBase {
// locators
// methods to click, read data, test element presence, ...
}
public class Test1 extends TestBase {
@Test
public void testValidLogin() {
driver.get("http://example.com");
pause(5000);
Login.fillUsername("user1");
Login.fillPassword("secret");
Login.clickSubmit();
pause(5000);
Home.testLogoutBtnPresent();
}
}
В приведенном выше коде драйвер является статическим и создается в @BeforeMethod. Вам может понадобиться, но редко, вам нужно создавать разные экземпляры драйверов. Пока мои тесты не требуют одновременных сессий, я буду использовать статический драйвер. Лично я считаю, что необходимость создания новых экземпляров Page приведет к гораздо более длительным методам тестирования и потребует значительного времени на размышления (когда создавать, как я называю экземпляр, могу ли я повторно использовать экземпляр).
Ваш вопрос не совсем понятен, потому что в заголовке вы задаете что-то иное, чем содержание вопроса, но я постараюсь ответить:
Я думаю, у вас есть два варианта, как инициализировать WebDriver без использования статического драйвера.
Первый вариант: вы не будете использовать конструктор, но будете инициализировать веб-драйвер, вызывая метод setUp() при каждом запуске теста.
public class Base {
protected WebDriver driver;
@BeforeClass
public void setUp() {
System.setProperty("webdriver.chrome.driver","chromedriver.linux");
driver = new ChromeDriver();
}
@AfterClass
public void tearDown() {
driver.quit();
}
}
public class Page extends Base {
@Test
public void testPage() {
driver.get("https://www.google.co.uk/");
}
}
Второй вариант: вы будете использовать конструктор в Page Class для инициализации веб-драйвера в базовом классе. Здесь вы всегда можете передать один и тот же экземпляр webdriver. (ОБНОВИТЬ этот вариант не хорошо)
public class PageClass{
public PageClass(WebDriver driver){
this.driver = driver;
}
public void testPage() {
driver.get("https://www.google.co.uk/");
}
}
public class MainTest {
public static void main(String[] args){
System.setProperty("webdriver.chrome.driver","chromedriver.linux");
WebDriver driver = new ChromeDriver();
PageClass pageClassTest = new PageClass(driver);
pageClassTest.testPage();
}
}
может быть, прояснение вашего вопроса поможет
Вторая опция UPDATE неверна, если вы используете junit или ngtest, вам следует использовать конструктор no-arg и инициализировать драйвер в методе @BeforeClass. Когда вы действительно настаиваете на использовании конструктора драйвера, вы должны создать свой собственный метод main, в котором вы будете запускать свой код, но я полагаю, что вы будете использовать преимущество фреймворков модульного тестирования.
Также, если вы хотите поделиться одним экземпляром webdriver, объявите его статическим. Вы просто будете читать из этого параметра. Поэтому я не вижу проблемы, когда вы хотите запустить тесты параллельно. Или, если есть некоторые р