2016-05-13 11 views
0

Java、Selenium、PhantomJSを使用してフォームを記入してサードパーティのWebサイトに送信するアプリケーションを作成するよう依頼されました(私はインターンなので、私)。セレンページオブジェクトの初期設定、ベストプラクティス

これには約12ページのバウンスが必要です。私はページごとに異なるクラスのページオブジェクトモデルを使用しています。私の質問は次のとおりです。

すべてのページオブジェクトを初期化する最良の方法は何ですか?

私は現在、このようにしています。

セットアップ中にアクセスできないページ(送信を確認するページ)があります。だから、毎回私がまたは初期化されていない場合がありますページに遭遇し、私はこれを行う:

if(fourthpagePageObject == null) 
    fourthpagePageObject = new FourthpagePageObject(driver); 

これは、これを行うには厄介な方法のように思えます。ページにアクセスする順序がわからないときにページオブジェクトを初期化するためのベストプラクティスはありますか?

答えて

0

私たちは、このような何かファクトリクラスを使用している:我々は、(我々はダースかそこらの工場を持ってwebdriverをしinstatiate、多くのファクトリクラスにそれを注入するために各1を春を使用している私たちのプロジェクトで

class PagesFactory{ 
    private WebDriver driver; 

    public HomePage getHomePage(){ 
     return new HomePage(driver); 
    } 

    // if you want to share the same object (singleton) among many tests 

    private SecondPage secondPage; 
    public SecondPage getSecondPage(){ 
     if(secondPage == null){ 
       secondPage = new SecondPage(driver); 
     } 
     return secondPage(driver); 
    } 
    ..... 
    ..... 
} 

をアプリケーションのさまざまな部分のページをグループ化します)。
テストクラスでは、必要なファクトリを簡単に取得できます。すべてのテストメソッドは、一部のページが必要なときにファクトリオブジェクトを参照するだけです。 Javaでは
は、それは、以下の方法で、例えば行うことができる(しかし、我々はまた、我々のテストクラスに工場をinstatiateして注入するために春を使用):

class TestSomePartOfApplication{ 
    KKKPages kkkPages = KKKPages.getInstance(); 
    AtosPages atosPages = AtosPages.getInstance(); 
    ..... 
    void testScenario1(){ 
     kkkPages.getPageA.fillField("Field name 1", 120); 
     kkkPages.getPageA.clickButtonOK(); 
     ...... 
    } 

    void testScenario2(){ 
     kkkPages.getPageB.fillField("Field 15", "abc"); 
     kkkPages.getPageA.clickButtonOK(); 
     atosPages.getPageC.fillField("Field 33", "Client name"); 
     ...... 
    } 
} 

あなたが質問に書いたので

セットアップ中に一部のページにアクセスできません(つまり、 の送信を確認するページ)。だから、毎回私はこれを行う、または初期化されていない かもしれページに遭遇:

ので、私はあなたがページオブジェクトは、新しいページオブジェクトを作成するための責任であるナビゲーション戦略を使用していることを推測しますいくつかの操作がこの新しいページにナビゲートする場合、別のページのこれは、あなたがページオブジェクトパターン、ログインページの通常の古典的な例に関連する多くの記事でこの戦略の例を見つけることができ、どこにでも見られる一般的なアドバイスです:

class LoginPage{ 

    public HomePage loginUaer(String user, String password){ 
     // fill in fields and click Login button 
     ..... 
     ..... 
     return new HomePage(....); 
    } 
} 

しかし、私たちは、この戦略は非常に困難であることがわかりました多くの共通要素で構成されているが、細かい点でのみ異なるページが多数ある複雑なアプリケーションでは、フォローする必要があります。このアプローチは、多くのクラスが互いに結合されなければならないため、多くの場合、ページオブジェクトはステートフルでなければならず、ページ上で実行された以前の操作を記憶しなければならないか、 /ウィンドウの内容?)ナビゲーションを行うことができないかどうか、そしてどのような種類のナビゲーション(例えば、ユーザーが間違ったパスワードを入力した場合は、エラーメッセージページが1つ表示され、フィールドが空の場合は別のページが表示されます。パスワードはOKで、ホームページなどに転送します)。これには、アプリケーションの動作を模倣するいくつかの複雑なルールをページオブジェクトに実装する必要があります。これは非常に面倒でエラーが発生しやすいです。私たちは、代わりに別の戦略を使用している
は、ここで説明:
http://martinfowler.com/bliki/PageObject.html

持つページオブジェクトが共通のアドバイスがあるナビゲーションのようなものに 応じて、他のページオブジェクトを作成するための責任を負うこと。しかしながら、いくつかの 開業医は、ページオブジェクトがいくつかの汎用ブラウザを返すことを好む。 コンテキストと、 の上に構築するページオブジェクト(特に条件付き が流れている)を制御するのは、である。その優先順位は、テストスクリプト が次に期待されるページを知っており、この知識がページオブジェクト自体に を複製する必要がないという事実に基づいています。静的型付き言語を使用するときには、 の優先度が高くなります。通常は、型シグニチャで ページのナビゲーションが表示されます。

このアプローチは非常にうまく機能します。非常に単純な操作をページ上に実装する独立した、分離されたステートレスなクラス(POJO)が多数あります。共通の要素(顧客リスト、顧客データセクション、添付セクション、メッセージセクションなど)を共有する数百のページがあり、それらがわずかに異なるだけであるケースを想像してみてください(1ページセクションA、B、Cを有し、他のものはB、C、D等を有する)。ページごとに別々のページオブジェクトを作成するのは現実的ではありません(何百ものクローズ - それは悪夢です)。このようなセクションごとにいくつかの独立したページオブジェクトがあり、テストフロー自体は次のようなテスト自体に実装されています。

pageFactoryA.getSectionAPage().clickButtonB(); 
pageFactoryB.getSectionBPage.fillInCustomerField(customerName); 
pageFactoryA.getSectionCPage.clickButton("Display customer report"); 
// the above operation should display a new page: Customer Report 
// so we get a CustomerReportPage from the factory 
int total = pageFactoryC.getCustomerReportPage().getTotal(); 
assertEquals(total, 2000); 
..... 
+0

これをすべて吸収するのに時間がかかりますが、 。どうもありがとうございました。 –

関連する問題