23

ページ オブジェクトをモデル化する場合、フォームと約 50 個の入力フィールドを持つページをどのように処理しますか? ここでのベストプラクティスは何ですか?

ページ オブジェクトを作成し、入力アクションごとに個別の関数を記述しますか? または、パラメーターが渡されてテキストを入力する関数を1つ記述しますか?

例えば

public void enterFirstName(String firstName) {
    driver.type("firstNameField", firstName);
}

public void enterSecondName(String secondName) {
    driver.type("secondNameField", secondName);
}

また

public void fillInForm(String inputFieldName, String text) {
    driver.type(inputFieldName, text);
}

最初のモデルでは、テストを記述するときにテストがより記述的であることがわかりますが、ページに入力フィールドが多すぎると、ページ オブジェクトの作成が面倒になります。

この投稿は、Page Objects Functional Automated Testing Best Practices with Selenium WebDriver での Selenium テストの構造化にも非常に興味深いものです。

4

6 に答える 6

10

ページ オブジェクト モデルの背後にある考え方は、呼び出し元から実装を抽象化することです。最初のメカニズムでは、html 入力フィールド名が「firstName」から「user_first_name」に変更されたかどうかを発信者が知る必要がないため、これを正常に実行できます。2 番目の実装では、実際のページへの変更はページオブジェクトのすべての呼び出し元に滴り落ちました。

ページ オブジェクトを作成する前に、より多くの作業が必要になる場合がありますが、カプセル化を維持すると、実際の html ページが必然的に変更されたときに長期的に作業を節約できます。

于 2011-11-03T16:24:36.273 に答える
9

私は常に、物事を関連情報のグループに分割するのが好きです。たとえば、ユーザー クラスがある場合、それをいくつかの小さなクラス (LoginCredentials、ProfileInfo、Settings など) に分割することがありますが、通常は、これらのサブ クラスを含むトップ レベルの User クラスを保持します。

私が確実にお勧めすることの 1 つは、これらの個々の関数すべてではなく、1 つの FillForm 関数にオブジェクトを渡すことです。このアプローチを使用すると、いくつかの大きな利点があります。1 つは、多くのテスト ケースで使用する「共通の」事前構成済みオブジェクトをいくつか用意できることです。例えば:

public class FormInfo
{
   string Domain;
   string Name;
   string Category;
   // etc...

  public FormInfo(string domain, string name, string category)
  {
     Domain = domain;
     Name = name;
     Category = category;
     // etc...
  }
}


// Somewhere in your initialization code
public static FormInfo Info1 = new FormInfo("myDomain1", "myName1", "myCategory1");
public static FormInfo Info2 = new FormInfo("myDomain2", "myName2", "myCategory2");

You can still update one of your common merchants if you need to do something one-off:

// In your test case:
Info1.Category = "blah";
FormPage.FillForm(Info1);

または、必要に応じて、特定のテスト ケース用に新しいマーチャント オブジェクトを作成することもできます。これらのオブジェクトを使用してフィールド検証などを行うこともできます。または、私が通常行うことは、特定のフィールド検証のためにページ オブジェクト パターンを壊すことです。そのため、マーチャント ドメイン フィールドを検証する場合は、次のようにします。

Info1.Domain = null; //This should make the FillForm function skip doing anything with this field.
FormPage.FillForm(Info1);
FormPage.DomainTextBox.Text = "field validation string";

このアプローチのもう 1 つの重要な利点は、フィールドを追加、削除、または変更するためにページが更新された場合、FormInfo オブジェクトと FillForm 関数を更新するだけで済み、FillForm 関数を呼び出す特定のテスト ケースを変更する必要がないことです。一般的な FormInfo オブジェクトの 1 つを使用していると仮定します。より多くのカバレッジを取得する別の可能性は、共通の FormInfo オブジェクトの 1 つを設定して、最小/最大長に準拠し、許可されているすべての異なる文字間を循環する各フィールドのランダム文字列を生成することです。これにより、同じ一連のテストから追加のテストを取得できますが、特定の文字列からのみ失敗の結果を取得し始めるとノイズが追加される可能性があるため、注意してください。

于 2011-11-03T19:49:01.127 に答える
1

あなたのメソッドに加えてenterWhatever()、私は通常、テストの本当の目的が何か他のものであるcreateWhatever(field1, field2, ...)場合に使用するために、フォームが構築するものを作成するための高速パスとして使用できるメソッドも作成します。したがって、チケットの送信をテストするために Customer を作成する必要がある場合、テストはページに移動して を呼び出すだけで、その Customer を使用してチケットを作成するというより微妙なタスクに進みます。CreateACustomercreateCustomer(firstName, lastName, emailAddress, ...)

于 2011-11-03T22:06:14.070 に答える
1

読者の利益のために古い質問に答えています。

ここでの他の良い答えに加えて、POM を初めて使用する人のためにここにいくつかの提案を追加したいと思います。

ページ オブジェクトはよく知られたデザイン パターンであり、オートメーション エンジニアに広く受け入れられており、アプリケーションのページごとに個別のクラス ファイルを作成して、すべての要素をプロパティとしてグループ化し、その動作/ビジネス機能をクラスのメソッドとしてグループ化します。ただし、ページのクラスを作成する際に問題はほとんどありません。特に、ページに要素のセットが多い/異なる/グリッド/カレンダー ウィジェット/HTML テーブルなどの複雑な要素がある場合は特にそうです。

クラスに含まれる責任が多すぎて処理できない場合があります。再構築して、より小さなクラスに分割する必要があります。つまり、 Single Responsibility Responsibleに従います

アイデアについては、こちらの画像を確認してください。

ここに画像の説明を入力

つまり、再利用可能なページ フラグメントを作成し、メイン ページ オブジェクトにページ フラグメントを提供させます。

詳細については、こちらをご覧ください。

于 2016-10-24T13:40:40.013 に答える
0

https://github.com/yujunliang/seleniumcapsulesの readme をご覧ください。

于 2014-05-29T04:03:29.487 に答える
0

フォームでこれを行う方法は、ページ上のすべての入力のリストを取得することです。次に、表示されていない入力要素をすべて削除します。その後、有効または無効なテキストを各入力に入れることができます。そこから、検証の概要をキャッチして、正しいエラーが発生しているかどうかを確認します。そうでない場合は、例外をログに記録します。

これにより、ページにある入力と同じ数のテキストを入力できるようになり、例外をログに記録して電子メールで送信することもできます。また、リスト内のテキストエリアとパスワード フィールドをキャッチし、チェックボックス フィールドとオプション用に別のリストを用意しています。これは、通常、それらでやりたいことが異なるためです。

要するに、ページをテストするために私がしなければならないことはこれだけです:

for (int i = 0; i < inputs.Count(); i++)
{
  //This captures the error message string created in the input validation method
  //nextButton is the IWebElement of the button to click to submit the form for validation
  //ErrorMessageID is the ID of the Validation Summary display box (i.e. ErrorMessageID = "FormSummary" <asp:ValidationSummary ID="FormSummary" runat="server" CssClass="errorMessage" />

  string InputValidationText = utilities.InputValidation(driver, inputs, i, nextButton, ErrorMessageID)
  if(InputValidationText != string.Empty)
  {
    //LogError
  }
}
于 2011-11-03T16:53:09.877 に答える