2016-03-31 3 views
0

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

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

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

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

Надеюсь, я понятен!

+1

Кажется, что вы на самом деле не поняли :). Вы хотите протестировать свою страницу авторизации и спросить, можно ли использовать один метод для проверки как успешных, так и недействительных случаев авторизации? – Andersson

+0

Вкратце, мой вопрос заключается в том, где поставить утверждение: непосредственно в JUnit test, в состоянии драйвера (check element) ИЛИ используя проверку (например, в конструкторе) нового класса 'LoginErrorPage'. Я могу изменить свой вопрос, если вы хотите? – buzz2buzz

+2

Вам не нужно проверять элементы страницы. Просто используйте 'driver.getCurrentUrl()', чтобы проверить, возвращает ли 'submitLoginForm' страницу' index' или 'error'. – Andersson

ответ

1

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

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

IE (в очень pseudocodish способом)

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)) 

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

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

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

+0

Вот что я начал. Таким образом, нам нужно создать страницу для каждого случая ошибки, а затем ввести утверждения (не реально «assert», а некоторые проверки). Но меня что-то беспокоит: объекты страницы должны представлять страницу с доступными действиями пользователя? Так что на самом деле нет submitValid или submitInvalid, просто отправьте.И в этом случае тест JUnit должен содержать утверждение, потому что submit возвращает теоретически следующую страницу. Я немного смущен – buzz2buzz

+1

Небольшой компромисс для инкапсуляции логики в ваши объекты страницы. Вы найдете ту же проблему с отправкой недопустимой формы, которая возвращает ту же страницу. И.Е. создать новую учетную запись ... если пользователь вводит неверные данные submitInvalid должен возвращать новую страницу «self» (и, очевидно, вам следует предоставить некоторый общий механизм проверки сообщений, присутствующих на странице, 'getErrorMessages()' или таких) –

+1

@ buzz2buzz One другая вещь, которая только что перешла мне на ум. Мое предположение заключалось в том, что ваша страница 'LoginError' - это другая страница, чем' Login' (URL или структура). Если это только «LoginPage» с сообщением об ошибке, вы не создаете новую страницу, вы просто создаете механизм для проверки наличия сообщений (error/info) на странице –