我有一个关于错误页面的一般性问题。 想象一个简单的用例,好的(1)和坏的(2)认证。
在案例(1)中,我们获得了索引页面 在第(2)例中,我们有一个特定的错误页面。
关键是,我有一个页面对象LoginPage
,submitLoginForm
应该返回下一页。我点击它并填写了一个糟糕的登录表单。
然后,我们有2个处理它的选项:
- 我们应该创建一个LoginErrorPage
并让LoginPage
submitNonValidLoginForm
返回此LoginErrorPage
吗?
- 我们是否应该LoginPage
使用submitLoginForm
返回'权利'导航页面IndexPage
,并在Junit测试中,断言驱动程序的实际状态(没有IndexPage
个元素,但其他一些元素。)
我希望我清楚! 谢谢
答案 0 :(得分:1)
根据我的个人经验,我可以说,为(概念上)不同的页面设置不同的页面对象往往更好,即使我们正在讨论具有不同内容的相同URL。
因此,我建议您按照第一个选项创建LoginError
页面对象。另一件事是页面验证应该在你的页面对象中完成,而不是作为测试,因为你直接在测试和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个测试之后,你会发现这个问题过于冗长,如果在成功提交后收到的页面发生了变化,那么你将有很多重写要做。