ページオブジェクトモデルとファクトリー Selenium

⚡ スマートサマリー

ページオブジェクトモデルとページファクトリー Selenium 堅牢で保守性の高いテスト自動化フレームワークを構築するための構造化された設計パターンを定義します。Web要素とその動作をカプセル化するページ固有のクラスの作成を重視しており、これにより重複が削減され、可読性とスケーラビリティが向上します。 Selenium テスト スクリプト。

  • コアコンセプト: 各アプリケーション ページは、Web 要素とそこで実行されるアクションの両方を含む専用のページ クラスに対応しており、UI 構造とテスト ロジックを明確に分離できます。
  • 実装の焦点: POM は、再利用可能で集中化された要素管理を促進します。ページ要素を変更するには、複数のスクリプトではなく 1 つのクラスの更新のみが必要です。
  • デザイン上の利点: このモデルは、次のようなフレームワークと統合できる、よりクリーンでモジュール化されたツールに依存しないオブジェクトリポジトリを保証します。 TestNG, JUnit, Cucumber、または JBehave。
  • 命名規則: ページクラス内のメソッドは実際のUIアクションを反映する必要があります(例: gotoHomePage())、自動化ワークフローにおける意味の明確さを強化します。
  • 強化された構造: ページファクトリーはPOMを改良するために @FindBy 注釈と PageFactory.initElements() WebElementの自動初期化により、繰り返しの作業が不要になります findElement 呼び出します。
  • パフォーマンスの最適化: AjaxElementLocatorFactory 遅延読み込み(要素はアクセスされたときにのみ配置される)を導入し、実行効率を向上させ、動的なページ動作を適切に処理します。
  • 結果: 統一されたアプローチにより、保守性、可読性、拡張性に優れたテスト自動化アーキテクチャが実現し、最新の Selenium 実践。

ページオブジェクトモデル

ページ オブジェクト モデルとは何ですか? 主なコンポーネントは何ですか?

ページ オブジェクト モデル (POM) テスト自動化で広く使用されている設計パターンで、Web UI要素用のオブジェクトリポジトリを作成します。このモデルの利点は、コードの重複を減らし、テストのメンテナンス性を向上させることです。

このモデルでは、アプリケーション内の各Webページに対応するPageクラスが必要です。Pag​​eクラスは、そのWebページのWeb要素を識別し、それらのWeb要素に対して操作を実行するPageメソッドも含みます。これらのメソッドの名前は、実行するタスクに応じて指定する必要があります。例えば、ローダーが決済ゲートウェイの表示を待機している場合、POMメソッド名はwaitForPaymentScreenDisplay()となります。

ページオブジェクトモデルの主要コンポーネント

  • ページクラス: 各 Web ページを個別のクラスとして表します。
  • ロケーター: ID、XPath、または CSS セレクターを使用して Web 要素を識別します。
  • メソッド: .page 要素に対して実行されるアクションまたは操作が含まれます。
  • 再利用性: Promoテストコードの再利用とテスト間のメンテナンスの容易化。
  • 関心事の分離: 整理しやすくするために、ページ構造をテスト ロジックから独立させます。

ページオブジェクトモデル

なぜページオブジェクトモデルを使うのか?

UI自動化を開始する Selenium webdriver 難しい作業ではありません。要素を見つけて、それに対して操作を実行するだけです。

ウェブサイトにログインするためのこの簡単なスクリプトを検討してください。

ページオブジェクトモデル

ご覧のとおり、私たちが行っているのは要素を見つけて、それらの要素に値を入力することだけです。

これは時間がかかり、エラーが発生しやすいスクリプトです。最初は簡単そうに見えますが、テストスイートが拡大するにつれて、要素の変更管理が難しくなります。そして、時間の経過とともにテストスイートは大きくなります。コードに行を追加していくにつれて、状況はますます困難になっていきます。

スクリプトのメンテナンスに関する主な問題は、10 個の異なるスクリプトが同じページ要素を使用しており、その要素を変更すると、10 個のスクリプトすべてを変更する必要があることです。 これには時間がかかり、エラーが発生しやすくなります。

スクリプトのメンテナンスにおけるより良いアプローチは、Web要素を検出し、値を入力し、検証する個別のクラスファイルを作成することです。このクラスファイルは、同じ要素を操作する複数のテストスクリプトで再利用できます。将来、Web要素に変更があった場合、10個の異なるスクリプトではなく、1つのクラスファイルだけで変更を加えることができます。

このアプローチは、以下ではページ オブジェクト モデルと呼ばれます。 Seleniumコードの可読性、保守性、再利用性が向上します。

 ページオブジェクトモデル

👉 無料ライブ登録 Selenium プロジェクト

POMのメリット

  1. ページ オブジェクト デザイン パターンでは、UI の操作とフローは検証から分離する必要があるとされています。この概念により、コードがよりクリーンでわかりやすくなります。
  2. 2つ目の利点は、オブジェクトリポジトリがテストケースから独立しているため、同じオブジェクトリポジトリを異なるツールで異なる目的に使用できることです。例えば、ページオブジェクトモデルを統合できます。 Selenium   TestNG/JUnit 機能のため テスト そして同時にJBehave/Cucumber 受け入れテスト用。
  3. Code POMクラス内のページメソッドを再利用するため、コード量が少なくなり、最適化されます。
  4. メソッドには、UI で発生する操作に簡単にマッピングできる、より現実的な名前が付けられます。つまり、ボタンをクリックした後にホームページに移動する場合、メソッド名は「gotoHomePage()」のようになります。

POMの実装方法 Selenium?

ページオブジェクトモデルフレームワークの基本構造におけるシンプルなPLog。 AUT これらのWeb要素を操作するメソッドはclogファイル内に保持されます。検証などのタスクは、テストメソッドの一部として別途定義する必要があります。

POMの導入

完全な例

テストケース: に行く Guru99 デモサイト。

ステップ 1) に移動します Guru99 デモサイト

POMの導入

ステップ2)ホームページで、テキスト「Guru「99 Bank」が存在します

POMの導入

ステップ 3) アプリケーションにログインする

POMの導入

ステップ 4) ホームページに「マネージャー ID: デモ」というテキストが含まれていることを確認します。

POMの導入

この例では、次の 2 つのページを扱います。

  1. ログインページ
  2. ホームページ (ログインすると表示されます)

したがって、2つのPOMを作成します。 Selenium クラス

Guru99 ログインページ POM

package pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99Login {
    WebDriver driver;
    By user99GuruName = By.name("uid");
    By password99Guru = By.name("password");
    By titleText =By.className("barone");
    By login = By.name("btnLogin");
    public Guru99Login(WebDriver driver){
        this.driver = driver;
    }
    //Set user name in textbox
    public void setUserName(String strUserName){
        driver.findElement(user99GuruName).sendKeys(strUserName);
    }
    //Set password in password textbox
    public void setPassword(String strPassword){
         driver.findElement(password99Guru).sendKeys(strPassword);
    }
    //Click on the login button
    public void clickLogin(){
            driver.findElement(login).click();
    }
    //Get the title of Login Page
    public String getLoginTitle(){
     return    driver.findElement(titleText).getText();
    }
    /**
     * This POM method allows the test case to perform the login operation
     * @param strUserName
     * @param strPasword
     * @return
     */
    public void loginToGuru99(String strUserName,String strPasword){
        //Fill user name
        this.setUserName(strUserName);
        //Fill password
        this.setPassword(strPasword);
        //Click Login button
        this.clickLogin();        
    }
}

Guru99 ホームページ POM Selenium

package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99HomePage {
    WebDriver driver;
    By homePageUserName = By.xpath("//table//tr[@class='heading3']");
    public Guru99HomePage(WebDriver driver){
        this.driver = driver;
    }
    //Get the User name from Home Page
        public String getHomePageDashboardUserName(){
         return    driver.findElement(homePageUserName).getText();
        }
}

Guru99 シンプルな POM Selenium テストケース

package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import pages.Guru99HomePage;
import pages.Guru99Login;
public class Test99GuruLogin {
    String driverPath = "C:\\geckodriver.exe";    
    WebDriver driver;
    Guru99Login objLogin;
    Guru99HomePage objHomePage;
    @BeforeTest
    public void setup(){
	System.setProperty("webdriver.gecko.driver", driverPath);        
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://demo.guru99.com/V4/");
    }
    /**
     * This test case will login in https://demo.guru99.com/V4/
     * Verify login page title as guru99 bank
     * Login to application
     * Verify the home page using Dashboard message
     */
    @Test(priority=0)
    public void test_Home_Page_Appear_Correct(){
        //Create Login Page object
    objLogin = new Guru99Login(driver);
    //Verify login page title
    String loginPageTitle = objLogin.getLoginTitle();
    Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
    //login to application
    objLogin.loginToGuru99("mgr123", "mgr!23");
    // go the next page
    objHomePage = new Guru99HomePage(driver);
    //Verify home page
    Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
    }

ページファクトリーとは何ですか Selenium?

ページファクトリー Selenium は、組み込みのページ オブジェクト モデル フレームワークの概念です。 Selenium 実行速度ではなく、アノテーションを用いて要素の繰り返し参照を削減することで保守性を向上させるWebDriverです。Pag​​eオブジェクトの初期化、またはPageオブジェクト自体のインスタンス化に使用されます。また、「FindElement/s」を使用せずにPageクラス要素を初期化する場合にも使用されます。

ここでも、ページ オブジェクト リポジトリとテスト メソッドの分離の概念に従います。さらに、クラス PageFactory の助けを借りて、 Selenium、注釈を使用します @FindBy WebElementを見つけます。Web要素を初期化するにはinitElementsメソッドを使用します。

ページ工場出荷時 Selenium

@FindBy 受け入れることができます tagName、partialLinkText、名前、linkText、id、css、className、xpath 属性として。

Page Factory を使用して上記と同じ例を見てみましょう

GuruPage Factoryを使用したログインページ99

package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99Login {
    /**
     * All WebElements are identified by @FindBy annotation
     */
    WebDriver driver;
    @FindBy(name="uid")
    WebElement user99GuruName;
    @FindBy(name="password")
    WebElement password99Guru;    
    @FindBy(className="barone")
    WebElement titleText;
    @FindBy(name="btnLogin")
    WebElement login;
    public Guru99Login(WebDriver driver){
        this.driver = driver;
        //This initElements method will create all WebElements
        PageFactory.initElements(driver, this);
    }
    //Set user name in textbox
    public void setUserName(String strUserName){
        user99GuruName.sendKeys(strUserName);     
    }
    //Set password in password textbox
    public void setPassword(String strPassword){
    password99Guru.sendKeys(strPassword);
    }
    //Click on login button
    public void clickLogin(){
            login.click();

    }  
    //Get the title of Login Page
    public String getLoginTitle(){
     return    titleText.getText();
    }
    /**
     * This POM method will be exposed in test case to login in the application
     * @param strUserName
     * @param strPasword
     * @return
     */
    public void loginToGuru99(String strUserName,String strPasword){
        //Fill user name
        this.setUserName(strUserName);
        //Fill password
        this.setPassword(strPasword);
        //Click Login button
        this.clickLogin();           
    }
}

GuruPage Factoryを使用した99のホームページ

package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99HomePage {
    WebDriver driver;
    @FindBy(xpath="//table//tr[@class='heading3']")
    WebElement homePageUserName;    
    public Guru99HomePage(WebDriver driver){
        this.driver = driver;
        //This initElements method will create all WebElements
        PageFactory.initElements(driver, this);
    }   
    //Get the User name from Home Page
        public String getHomePageDashboardUserName(){
         return    homePageUserName.getText();
        }
}

Guruページファクトリーの概念を用いた99のテストケース

package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import PageFactory.Guru99HomePage;
import PageFactory.Guru99Login;
public class Test99GuruLoginWithPageFactory {
    String driverPath = "C:\\geckodriver.exe";    
    WebDriver driver;
    Guru99Login objLogin;
    Guru99HomePage objHomePage; 
    @BeforeTest
    public void setup(){
        System.setProperty("webdriver.gecko.driver", driverPath);       
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://demo.guru99.com/V4/");
    }
    /**
     * This test go to https://demo.guru99.com/V4/
     * Verify login page title as guru99 bank
     * Login to application
     * Verify the home page using Dashboard message
     */
    @Test(priority=0)
    public void test_Home_Page_Appear_Correct(){
        //Create Login Page object
    objLogin = new Guru99Login(driver);
    //Verify login page title
    String loginPageTitle = objLogin.getLoginTitle();
    Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
    //login to application
    objLogin.loginToGuru99("mgr123", "mgr!23");
    // go the next page
    objHomePage = new Guru99HomePage(driver);
    //Verify home page
    Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
    }
}

完全なプロジェクト構造は次の図のようになります。

ページファクトリー Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory PageFactory の遅延読み込みの概念です。 Selenium。これは、Web要素が何らかの操作で使用されている場合にのみ、その要素を見つけるために使用されます。オブジェクトページクラスにWebElementsのタイムアウトを割り当てます。Pag​​eFactoryパターンを使用する主な利点の1つは、 Selenium は AjaxElementLocatorFactory クラスです。

ここで、要素に対して操作が実行されると、その瞬間からその要素の可視性の待機が開始されます。指定された時間間隔内に要素が見つからない場合は、 テストケース 実行すると「NoSuchElementException」例外がスローされます。

AjaxElement ロケーター ファクトリ

具体的な例を挙げますと、以下の通りです。

AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10);
PageFactory.initElements(factory, this);

ダウンロード Selenium このチュートリアルのデモ用のプロジェクト ファイル

よくあるご質問

ページオブジェクトモデルは、tractsのWebページ要素を個別のクラスに分割します。これにより、UI操作とテストロジックを分離することで自動化が簡素化され、明瞭性、拡張性、コードの重複削減が促進されます。

In SeleniumPOMは、各Webページをロケーターとアクションを含む専用のクラスとして表現します。UI要素をカプセル化することで、テストスクリプトは基盤となるページ構造の変更の影響を受けずに実行できます。

POMはスタンドアロンのフレームワークではなく、デザインパターンです。あらゆる自動化フレームワークに統合することで、テストを効率的に構造化し、組織化、再利用性、保守性を向上させることができます。

POMとは、各Webページを定義されたロケータとメソッドを持つクラスとしてモデル化する設計原則です。テストロジックをUI要素から分離することで、可読性、スケーラビリティ、そして長期的なメンテナンス性を向上させます。

POMはページabsの設計構造を定義しますtraction、一方 Page Factory は注釈とメソッドを提供します (@FindBy) は、Web 要素を効率的に初期化するためのものです。Pag​​e Factory は、POM の実装拡張機能です。

POMは、要素ロケーターとページアクションを専用クラス内に一元管理します。UIの変更は1か所で更新するだけで済むため、手戻りを最小限に抑え、コードの再利用性を向上させ、テストのメンテナンスを迅速化できます。

はい。AI 駆動型テストジェネレーターは、UI 階層を分析して POM クラスを自動的に作成し、関心の論理的な分離を維持しながら、エンドツーエンドのテスト作成を加速できます。

POM はモジュール式で再利用可能なテスト コンポーネントを推進し、ロケーターを自動更新する AI ベースのテスト メンテナンス ツールとの統合を可能にして、スクリプトの脆弱性とメンテナンスのオーバーヘッドを削減します。