Обработка страниц ошибок шаблона объекта страницы Selenium

У меня общий вопрос по страницам с ошибками. Представьте себе простой вариант использования, хорошую (1) и плохую (2) аутентификацию.

В случае (1) у нас есть индексная страница.
В случае (2) у нас есть конкретная страница с ошибкой.

Дело в том, что у меня есть объект страницы LoginPage, и submitLoginForm должен возвращать следующую страницу. Я нажимаю на нее с заполненной неправильной формой входа.

Затем у нас есть 2 варианта решения этой проблемы:
- следует ли нам создать LoginErrorPage и дать LoginPage submitNonValidLoginForm, возвращая это LoginErrorPage?
- следует ли использоватьLoginPage с submitLoginForm, возвращающим «правильную» страницу навигации IndexPage, и в тест Junit, проверяющий реальное состояние драйвера (не содержит IndexPage элементов, кроме некоторых других).

Надеюсь, все понятно!
Спасибо


person buzz2buzz    schedule 31.03.2016    source источник
comment
Похоже, вам не совсем понятно :) Вы хотите протестировать свою страницу авторизации и спросить, можно ли использовать один метод для проверки как успешных, так и неудачных случаев авторизации или нет?   -  person Andersson    schedule 31.03.2016
comment
Вкратце, мой вопрос заключается в том, где разместить утверждение: в тесте JUnit напрямую, в состоянии драйвера (элемент проверки) ИЛИ с помощью проверки (например, в конструкторе) нового класса LoginErrorPage. Я могу отредактировать свой вопрос, если хотите?   -  person buzz2buzz    schedule 31.03.2016
comment
Вам не нужно проверять элементы страницы. Просто используйте driver.getCurrentUrl(), чтобы проверить, вернул ли submitLoginForm index страницу или error страницу.   -  person Andersson    schedule 31.03.2016
comment
Ничего страшного, если URL-адреса разные, и в некоторых случаях это неправда.   -  person buzz2buzz    schedule 31.03.2016


Ответы (1)


По своему личному опыту могу сказать, что лучше иметь разные объекты страницы для (концептуально) разных страниц, даже когда мы говорим об одном и том же URL с разным содержанием.

Поэтому я предлагаю следовать вашему первому варианту, создав объект LoginError Page. Другое дело, что проверка страницы должна выполняться в вашем объекте страницы, а не как тест, потому что вы напрямую создаете зависимость между тестом и Selenium.

I.E (очень псевдокодовым способом)

class BasePage {
    constructor (driver, context, isLoaded = false) {
        this->webDriver = driver

        //clicking links or submitting forms from other page objects 
        //will trigger the page load at driver level so we don't want to trigger a page reload  
        if (isLoaded) {
            this->loadPage()
        }

        this->validatePage()
    }

    loadPage() {
        this->webDriver->get(this->getPageUrl)
    }

    abstract validatePage()
    abstract getPageUrl()
}


class LoginPage extends BasePage{

    validatePage() {
        this->elementUsername = this->webDriver->findElement(WebDriverBy::id('username'))
        this->elementPassword = this->webDriver->findElement(WebDriverBy::id('password'))
        this->elementSubmit = this->webDriver->findElement(WebDriverBy::id('submit'))
    }
    getPageUrl() {
        return '/login/'
    }

    fillUser(value) {
        this->elementUsername->sendKeys(value)
    }

    fillPassword(value) {
        this->elementPassword->sendKeys(value)
    }

    submitValid() {
        this->elementSubmit->submit()
        return new DashboardPage(this->webDriver, this->context, true)
    }

    submitInvalid() {
        this->elementSubmit->submit()
        return new LoginErrorPage(this->webDriver, this->context, true)
    }
}

class DashboardPage extends BasePage {
    validatePage() {
        this->webDriver->findElement(WebDriverBy::id('welcomeMessage'))
    }

    getPageUrl() {
        return '/dashboard/'
    }
}

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

testValidCredentials:
    login = new LoginPage(..)
    login->fillUser('john')
    login->fillPassword('aa')
    dashboard = login->submitValid()

testInvalidCredentials:
    login = new LoginPage(..)
    login->fillUser('john')
    login->fillPassword('aa')
    loginError = login->submitInvalid()

testWelcomeMessage:
    dashboard = new DashboardPage(..)
    // a bad (but short enough) example, don't actually do this 
    assert(true, regexp('welcome', dashboard->getSource)) 

L.E. С точки зрения тестирования вы должны знать свой ожидаемый результат. Другой подход состоял бы в том, чтобы иметь одну отправку, которая принимает ожидаемый объект страницы в качестве параметра.

testInvalidCredentials:
    login = new LoginPage(..)
    login->fillUser('john')
    login->fillPassword('aa')
    loginError = login->submit('LoginErrorPage')
    assertContains('invalid login', loginError->getErrorMessages())

Но после написания 100 тестов вы обнаружите, что это слишком многословно, и, если страница, полученная после успешной отправки, изменится, вам придется много переписывать.

person the-noob    schedule 31.03.2016
comment
Вот что я начал. Итак, нам нужно создать страницу для каждого случая ошибки, а затем ввести утверждения (на самом деле не «assert», а некоторые проверки). Но что-то меня беспокоит: объекты страницы должны представлять страницу с доступными действиями пользователя, верно? Так что на самом деле нет submitValid или submitInvalid, просто отправьте. И в этом случае тест JUnit должен содержать утверждение, потому что submit возвращает теоретически следующую страницу. Я немного запутался - person buzz2buzz; 31.03.2016
comment
Небольшой компромисс ради инкапсуляции логики в ваших объектах страницы. Вы обнаружите ту же проблему с отправкой недействительной формы, которая возвращает ту же страницу. I.E. создать новую учетную запись ... если пользователь вводит неправильные данные, submitInvalid должен вернуть новую страницу self (и, очевидно, вы должны предоставить какой-то общий механизм для проверки сообщений, присутствующих на странице, getErrorMessages() или тому подобное) - person the-noob; 31.03.2016
comment
@ buzz2buzz Еще одна вещь, которая пришла мне в голову. Я предполагал, что ваша LoginError страница - это не страница Login (URL или структура). Если это просто LoginPage с сообщением об ошибке, тогда вы не создаете новую страницу, вы просто создаете механизм для проверки наличия сообщений (ошибки / информации) на странице - person the-noob; 31.03.2016