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

ページ オブジェクト モデルとは何ですか? 主なコンポーネントは何ですか?
ページ オブジェクト モデル (POM) テスト自動化で広く使用されている設計パターンで、Web UI要素用のオブジェクトリポジトリを作成します。このモデルの利点は、コードの重複を減らし、テストのメンテナンス性を向上させることです。
このモデルでは、アプリケーション内の各Webページに対応するPageクラスが必要です。Pageクラスは、その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のメリット
- ページ オブジェクト デザイン パターンでは、UI の操作とフローは検証から分離する必要があるとされています。この概念により、コードがよりクリーンでわかりやすくなります。
- 2つ目の利点は、オブジェクトリポジトリがテストケースから独立しているため、同じオブジェクトリポジトリを異なるツールで異なる目的に使用できることです。例えば、ページオブジェクトモデルを統合できます。 Selenium TestNG/JUnit 機能のため テスト そして同時にJBehave/Cucumber 受け入れテスト用。
- Code POMクラス内のページメソッドを再利用するため、コード量が少なくなり、最適化されます。
- メソッドには、UI で発生する操作に簡単にマッピングできる、より現実的な名前が付けられます。つまり、ボタンをクリックした後にホームページに移動する場合、メソッド名は「gotoHomePage()」のようになります。
POMの実装方法 Selenium?
ページオブジェクトモデルフレームワークの基本構造におけるシンプルなPLog。 AUT これらのWeb要素を操作するメソッドはclogファイル内に保持されます。検証などのタスクは、テストメソッドの一部として別途定義する必要があります。
完全な例
テストケース: に行く Guru99 デモサイト。
ステップ 1) に移動します Guru99 デモサイト
ステップ2)ホームページで、テキスト「Guru「99 Bank」が存在します
ステップ 3) アプリケーションにログインする
ステップ 4) ホームページに「マネージャー ID: デモ」というテキストが含まれていることを確認します。
この例では、次の 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です。Pageオブジェクトの初期化、またはPageオブジェクト自体のインスタンス化に使用されます。また、「FindElement/s」を使用せずにPageクラス要素を初期化する場合にも使用されます。
ここでも、ページ オブジェクト リポジトリとテスト メソッドの分離の概念に従います。さらに、クラス PageFactory の助けを借りて、 Selenium、注釈を使用します @FindBy WebElementを見つけます。Web要素を初期化するにはinitElementsメソッドを使用します。
@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"));
}
}
完全なプロジェクト構造は次の図のようになります。
AjaxElementLocatorFactory
AjaxElementLocatorFactory PageFactory の遅延読み込みの概念です。 Selenium。これは、Web要素が何らかの操作で使用されている場合にのみ、その要素を見つけるために使用されます。オブジェクトページクラスにWebElementsのタイムアウトを割り当てます。PageFactoryパターンを使用する主な利点の1つは、 Selenium は AjaxElementLocatorFactory クラスです。
ここで、要素に対して操作が実行されると、その瞬間からその要素の可視性の待機が開始されます。指定された時間間隔内に要素が見つからない場合は、 テストケース 実行すると「NoSuchElementException」例外がスローされます。
具体的な例を挙げますと、以下の通りです。
AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(factory, this);
ダウンロード Selenium このチュートリアルのデモ用のプロジェクト ファイル











