По своему личному опыту могу сказать, что лучше иметь разные объекты страницы для (концептуально) разных страниц, даже когда мы говорим об одном и том же 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
LoginErrorPage
. Я могу отредактировать свой вопрос, если хотите? - person buzz2buzz   schedule 31.03.2016driver.getCurrentUrl()
, чтобы проверить, вернул лиsubmitLoginForm
index
страницу илиerror
страницу. - person Andersson   schedule 31.03.2016