Какие методы должны быть внутри класса Page в шаблоне проектирования POM? - PullRequest
2 голосов
/ 19 февраля 2020

Я создаю среду автоматизации тестирования пользовательского интерфейса, используя шаблон проектирования POM. Прочитав страницу SeleniumHQ для объектов страницы, я размышляю над тем, какие методы мне следует создавать внутри объекта страницы.

Давайте рассмотрим простой пример объекта страницы входа, состоящего из имени пользователя, текстовых полей пароля и кнопки отправки. Ссылка SeleniumHQ создала следующие методы:

1. typeUsername(String username)
2. typePassword(String password)
3. submitLogin()
4. submitLoginExceptionFailure()
5. loginAs(String username, String password)

Я немного озадачен, глядя на эти методы. Почему я должен создавать первые 3 метода (typeUsername, typePassword, submitLogin), когда я уже создаю метод loginAs. Есть мысли по этому поводу?

SeleniumHQ Link - https://github.com/SeleniumHQ/selenium/wiki/PageObjects

Вставка кода PageObject для LoginPage:

public class LoginPage {
    private final WebDriver driver;

    public LoginPage(WebDriver driver) {
        this.driver = driver;

        // Check that we're on the right page.
        if (!"Login".equals(driver.getTitle())) {
            // Alternatively, we could navigate to the login page, perhaps logging out first
            throw new IllegalStateException("This is not the login page");
        }
    }

    // The login page contains several HTML elements that will be represented as WebElements.
    // The locators for these elements should only be defined once.
        By usernameLocator = By.id("username");
        By passwordLocator = By.id("passwd");
        By loginButtonLocator = By.id("login");

    // The login page allows the user to type their username into the username field
    public LoginPage typeUsername(String username) {
        // This is the only place that "knows" how to enter a username
        driver.findElement(usernameLocator).sendKeys(username);

        // Return the current page object as this action doesn't navigate to a page represented by another PageObject
        return this;    
    }

    // The login page allows the user to type their password into the password field
    public LoginPage typePassword(String password) {
        // This is the only place that "knows" how to enter a password
        driver.findElement(passwordLocator).sendKeys(password);

        // Return the current page object as this action doesn't navigate to a page represented by another PageObject
        return this;    
    }

    // The login page allows the user to submit the login form
    public HomePage submitLogin() {
        // This is the only place that submits the login form and expects the destination to be the home page.
        // A seperate method should be created for the instance of clicking login whilst expecting a login failure. 
        driver.findElement(loginButtonLocator).submit();

        // Return a new page object representing the destination. Should the login page ever
        // go somewhere else (for example, a legal disclaimer) then changing the method signature
        // for this method will mean that all tests that rely on this behaviour won't compile.
        return new HomePage(driver);    
    }

    // The login page allows the user to submit the login form knowing that an invalid username and / or password were entered
    public LoginPage submitLoginExpectingFailure() {
        // This is the only place that submits the login form and expects the destination to be the login page due to login failure.
        driver.findElement(loginButtonLocator).submit();

        // Return a new page object representing the destination. Should the user ever be navigated to the home page after submiting a login with credentials 
        // expected to fail login, the script will fail when it attempts to instantiate the LoginPage PageObject.
        return new LoginPage(driver);   
    }

    // Conceptually, the login page offers the user the service of being able to "log into"
    // the application using a user name and password. 
    public HomePage loginAs(String username, String password) {
        // The PageObject methods that enter username, password & submit login have already defined and should not be repeated here.
        typeUsername(username);
        typePassword(password);
        return submitLogin();
    }
}

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Возможно, вы захотите проверить, если при вводе только имени пользователя и затем нажатия кнопки отправки отображается правильное сообщение об ошибке или только пароль, и т. Д. c.

Я обычно смотрю на страницу и пытаюсь Подводя итог, какие «действия» пользователь может делать на этой странице, каждое действие становится методом. Разные действия могут быть на разных «уровнях». например, на веб-сайте блога пользователь может ввести заголовок блога и содержимое блога, которые являются двумя действиями, которые может выполнять пользователь, но, глядя на другой уровень абстракции, пользователь хочет «создать» публикацию. Так что эта функция может снова вызывать другие функции.

По сути, как и в любом другом программировании, у вас есть несколько уровней абстракции, поэтому у вас есть объекты Page во-первых.

И просто используйте итеративный разработка, создайте функцию, которая выполняет то, что вы хотите протестировать, и если вы обнаружите, что повторно используете тот же код (или идентификатор) в других функциях, выделите их в новой функции

0 голосов
/ 19 февраля 2020

Точная нарезка вашего кода на большее количество методов позволяет увеличить атомизацию. Ничто не мешает вам сгруппировать typeUsername(), typePassword() и submitLogin() в метод login().

Достоинством этого является более точное знание того, что ваш логин не удался, скажем, при вводе пароля, а не на «где-нибудь на странице входа».

...