2016-03-31 8 views
0

エラーページに関する一般的な質問があります。 単純なユースケース、good(1)、bad(2)認証を想像してみてください。Selenium Pageオブジェクトパターンのエラー処理ページ

(1)の場合、インデックスページがあります。
ケース(2)では、特定のエラーページがあります。

ポイントは、私はページオブジェクトLoginPageを持っていて、submitLoginFormは次のページを返すはずです。私は満たされた不正なログインフォームでクリック

はその後、我々はそれを処理するための2つのオプション持っている:。
を - 私たちはLoginErrorPage作成する必要があり、これLoginErrorPageを返すLoginPagesubmitNonValidLoginForm与えますか?
LoginPagesubmitLoginFormを使用して、 '右'ナビゲーションページを返し、Junitテストでドライバの実際の状態をアサートします(IndexPageの要素がありません)。

私は明らかに希望です!
ありがとう

+1

あなたは実際にはクリアされていないようです:)あなたは認証ページをテストし、認証方法の成功と失敗の両方をチェックするために単一の方法を使用できるかどうか尋ねますか? – Andersson

+0

簡単に言えば、私の質問は、JUnitテストでは、ドライバの状態(要素のチェック)または新しいクラスのLoginErrorPageのチェック(コンストラクタなど)を使用して、アサーションを置く場所です。あなたが望むなら私の質問を編集できますか? – buzz2buzz

+2

ページ要素を確認する必要はありません。 'driver.getCurrentUrl()'を使って 'submitLoginForm'が' index'ページか 'error'ページを返したかどうかを確認するだけです。 – Andersson

答えて

1

私の個人的な経験から、異なるコンテンツの同じURLについて話しているときでも、(概念的に)異なるページに対して異なるページオブジェクトを持つ方がよいと言えるでしょう。

最初のオプションの後に、LoginErrorページオブジェクトを作成することをおすすめします。別のことは、テストとセレンの間の依存関係を直接作成するため、テストとしてではなくページの検証がページオブジェクトで行われることです。

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 テストの観点から、期待される結果を知る必要があります。別のアプローチは、あなたは、単一のそれはのparam

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

として期待ページオブジェクトを受け入れ提出しかし、100回のテストを書いた後、あなたがこのページに成功提出し、変更後に受信した場合には、あまりにも冗長であることを見つけることができます持っているだろう何度も書き直す必要があります。

+0

だから、各エラーケースごとにページを作成し、アサーションを入れておく必要があります(本当に「アサート」ではなく、いくつかのチェック)。しかし、何か気になります:ページオブジェクトは、利用可能なユーザーの行動が正しいページを表すべきですか?したがって、実際にsubmitValidまたはsubmitInvalidはなく、ただ送信してください。この場合、submitは理論的に次のページを返すので、JUnitテストにはアサーションが含まれている必要があります。私はちょっと混乱しています – buzz2buzz

+1

ページオブジェクトのロジックをカプセル化するための小さなトレードオフです。同じページを返す無効なフォームを送信すると、同じ問題が発生します。 I.新しいアカウントを作成する...ユーザーが間違ったデータを入力した場合submitInvalidは新しい 'self'ページを返さなければならない(明らかにページにあるメッセージをチェックするためのいくつかのジェネリックメカニズムを提供する必要がある、' getErrorMessages() 'など) –

+1

@ buzz2buzz One私の心をちょうど越えた他のもの。私の仮定は、あなたの 'LoginError'ページが' Login'(URLまたは構造体)とは別のページであるということでした。エラーメッセージが表示された「LoginPage」の場合は、新しいページを作成せず、ページ内のメッセージ(エラー/情報)の有無を確認するメカニズムを作成するだけです –

関連する問題