Selenium页面对象模式错误页面处理

时间:2016-03-31 08:14:37

标签: selenium junit navigation pageobjects

我有一个关于错误页面的一般性问题。 想象一个简单的用例,好的(1)和坏的(2)认证。

在案例(1)中,我们获得了索引页面 在第(2)例中,我们有一个特定的错误页面。

关键是,我有一个页面对象LoginPagesubmitLoginForm应该返回下一页。我点击它并填写了一个糟糕的登录表单。

然后,我们有2个处理它的选项:
- 我们应该创建一个LoginErrorPage并让LoginPage submitNonValidLoginForm返回此LoginErrorPage吗? - 我们是否应该LoginPage使用submitLoginForm返回'权利'导航页面IndexPage,并在Junit测试中,断言驱动程序的实际状态(没有IndexPage个元素,但其他一些元素。)

我希望我清楚! 谢谢

1 个答案:

答案 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个测试之后,你会发现这个问题过于冗长,如果在成功提交后收到的页面发生了变化,那么你将有很多重写要做。