Как мы можем инициализировать экземпляр веб-драйвера, не объявляя его статическим, и использовать один и тот же экземпляр во всех классах 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, объявите его статическим. Вы просто будете читать из этого параметра. Поэтому я не вижу проблемы, когда вы хотите запустить тесты параллельно. Или, если есть некоторые р

Другие вопросы по тегам