Mô hình Đối tượng Trang (POM) & Trang Nhà máy trong Hướng dẫn sử dụng Selenium

Mục lục:

Anonim

Mô hình Đối tượng Trang là gì?

Mô hình đối tượng trang (POM) là một mẫu thiết kế, được sử dụng phổ biến trong tự động hóa thử nghiệm để tạo Kho lưu trữ đối tượng cho các phần tử giao diện người dùng web. Ưu điểm của mô hình là giảm sự trùng lặp mã và cải thiện khả năng bảo trì thử nghiệm.

Theo mô hình này, đối với mỗi trang web trong ứng dụng, cần có một Lớp Trang tương ứng. Lớp Trang này sẽ xác định các WebElements của trang web đó và cũng chứa các phương thức của Trang thực hiện các hoạt động trên các WebElements đó. Tên của các phương thức này phải được cung cấp theo tác vụ mà chúng đang thực hiện, tức là, nếu một trình nạp đang đợi cổng thanh toán xuất hiện, thì tên phương thức POM có thể là waitForPaymentScreenDisplay ().

Trong hướng dẫn này, bạn sẽ học-

  • Tại sao lại là mô hình đối tượng trang?
  • Ưu điểm của POM
  • Làm thế nào để thực hiện POM?
  • Nhà máy Trang là gì?
  • Guru99 TestCase với khái niệm Nhà máy Trang
  • AjaxElementLocatorFactory

Tại sao lại là mô hình đối tượng trang?

Bắt đầu Tự động hóa giao diện người dùng trong Selenium WebDriver KHÔNG phải là một nhiệm vụ khó khăn. Bạn chỉ cần tìm các phần tử, thực hiện các thao tác trên đó.

Hãy xem xét tập lệnh đơn giản này để đăng nhập vào một trang web

Như bạn có thể quan sát, tất cả những gì chúng tôi đang làm là tìm các phần tử và điền giá trị cho các phần tử đó.

Đây là một kịch bản nhỏ. Bảo trì tập lệnh trông dễ dàng. Nhưng với thời gian bộ thử nghiệm sẽ phát triển. Khi bạn thêm ngày càng nhiều dòng vào mã của mình, mọi thứ trở nên khó khăn.

Vấn đề chính đối với việc bảo trì tập lệnh là nếu 10 tập lệnh khác nhau đang sử dụng cùng một phần tử trang, với bất kỳ thay đổi nào trong phần tử đó, bạn cần phải thay đổi tất cả 10 tập lệnh. Việc này tốn thời gian và dễ xảy ra lỗi.

Một cách tiếp cận tốt hơn để bảo trì tập lệnh là tạo một tệp lớp riêng biệt sẽ tìm thấy các phần tử web, điền chúng hoặc xác minh chúng. Lớp này có thể được sử dụng lại trong tất cả các tập lệnh sử dụng phần tử đó. Trong tương lai, nếu có thay đổi trong phần tử web, chúng ta cần thực hiện thay đổi chỉ trong 1 tệp lớp chứ không phải 10 tập lệnh khác nhau.

Cách tiếp cận này được gọi là Mô hình Đối tượng Trang trong Selenium. Nó giúp làm cho mã dễ đọc hơn, dễ bảo trì và có thể sử dụng lại.

Ưu điểm của POM

  1. Mẫu thiết kế đối tượng trang cho biết các hoạt động và luồng trong giao diện người dùng nên được tách biệt khỏi xác minh. Khái niệm này làm cho mã của chúng tôi sạch hơn và dễ hiểu.
  2. Lợi ích thứ hai là kho lưu trữ đối tượng độc lập với các trường hợp thử nghiệm, vì vậy chúng ta có thể sử dụng cùng một kho lưu trữ đối tượng cho một mục đích khác với các công cụ khác nhau. Ví dụ: chúng ta có thể tích hợp Mô hình đối tượng trang trong Selenium với TestNG / JUnit để kiểm tra chức năng và đồng thời với JBehave / Cucumber để kiểm tra chấp nhận.
  3. Mã trở nên ít hơn và được tối ưu hóa do các phương thức trang có thể sử dụng lại trong các lớp POM.
  4. Các phương thức có tên thực tế hơn, có thể dễ dàng ánh xạ với hoạt động diễn ra trong giao diện người dùng. tức là nếu sau khi nhấp vào nút chúng ta đến trang chủ, tên phương thức sẽ giống như 'gotoHomePage ()'.

Làm thế nào để thực hiện POM?

POM đơn giản:

Đó là cấu trúc cơ bản của khung mô hình đối tượng Trang, trong đó tất cả các Phần tử Web của AUT và phương thức hoạt động trên các Phần tử Web này được duy trì bên trong một tệp lớp. Một nhiệm vụ như xác minh phải được tách biệt như một phần của Phương pháp kiểm tra.

Hoàn thành ví dụ

TestCase: Truy cập Trang web Demo Guru99.

Bước 1) Truy cập Trang web Demo Guru99
Bước 2) Trong trang chủ kiểm tra văn bản "Guru99 Ngân hàng" là hiện tại
Bước 3) Đăng nhập vào ứng dụng
Bước 4) Xác minh rằng Trang chủ có chứa văn bản là "Id người quản lý: demo"

Đây là chúng tôi đang xử lý 2 trang

  1. Trang đăng nhập
  2. Trang chủ (hiển thị sau khi bạn đăng nhập)

Theo đó, chúng tôi tạo 2 POM trong các lớp Selenium

Guru99 Trang đăng nhập POM

các trang gói;nhập org.openqa.selenium.By;nhập org.openqa.selenium.WebDriver;lớp công khai Guru99Login {Trình điều khiển WebDriver;Bởi user99GuruName = By.name ("uid");Bởi password99Guru = By.name ("mật khẩu");Bởi titleText = By.className ("barone");Bằng cách đăng nhập = By.name ("btnLogin");public Guru99Login (trình điều khiển WebDriver) {this.driver = trình điều khiển;}// Đặt tên người dùng trong hộp văn bảnpublic void setUserName (String strUserName) {driver.findElement (user99GuruName) .sendKeys (strUserName);}// Đặt mật khẩu trong hộp văn bản mật khẩupublic void setPassword (String strPassword) {driver.findElement (password99Guru) .sendKeys (strPassword);}// Nhấp vào nút đăng nhậppublic void clickLogin () {driver.findElement (đăng nhập) .click ();}// Lấy tiêu đề của Trang đăng nhậppublic String getLoginTitle () {return driver.findElement (titleText) .getText ();}/ *** Phương thức POM này sẽ được hiển thị trong trường hợp thử nghiệm để đăng nhập vào ứng dụng* @param strUserName* @param strPasword* @trở về* /public void loginToGuru99 (String strUserName, String strPasword) {// Điền tên người dùngthis.setUserName (strUserName);// Điền mật khẩuthis.setPassword (strPasword);// Nhấp vào nút Đăng nhậpthis.clickLogin ();}}

Guru99 Trang chủ POM trong Selenium

các trang gói;nhập org.openqa.selenium.By;nhập org.openqa.selenium.WebDriver;lớp công khai Guru99HomePage {Trình điều khiển WebDriver;Bởi homePageUserName = By.xpath ("// bảng // tr [@ class = 'header3']");public Guru99HomePage (trình điều khiển WebDriver) {this.driver = trình điều khiển;}// Lấy tên người dùng từ Trang chủpublic String getHomePageDashboardUserName () {return driver.findElement (homePageUserName) .getText ();}}

Guru99 Simple POM trong Selenium Test case

gói thử nghiệm;nhập java.util.concurrent.TimeUnit;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.firefox.FirefoxDriver;nhập khẩu org.testng.Assert;nhập org.testng.annotations.BeforeTest;nhập org.testng.annotations.Test;nhập trang.Guru99HomePage;nhập trang.Guru99Login;lớp công khai Test99GuruLogin {String driverPath = "C: \\ geckodriver.exe";Trình điều khiển WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@Trước khi kiểm trapublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = new FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Trường hợp thử nghiệm này sẽ đăng nhập vào http://demo.guru99.com/V4/* Xác minh tiêu đề trang đăng nhập là ngân hàng guru99* Đăng nhập vào ứng dụng* Xác minh trang chủ bằng tin nhắn Trang tổng quan* /@Test (ưu tiên = 0)public void test_Home_Page_Appear_Correct () {// Tạo đối tượng Trang đăng nhậpobjLogin = new Guru99Login (trình điều khiển);// Xác minh tiêu đề trang đăng nhậpString loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Chứa ("ngân hàng guru99"));// đăng nhập vào ứng dụngobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// chuyển sang trang tiếp theoobjHomePage = new Guru99HomePage (trình điều khiển);// Xác minh trang chủAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Chứa ("id manger: mgr123"));}

Page Factory trong Selenium là gì?

Page Factory trong Selenium là một khái niệm khung Mô hình Đối tượng Trang có sẵn cho Selenium WebDriver nhưng nó được tối ưu hóa rất tốt. Nó được sử dụng để khởi tạo các đối tượng Trang hoặc để khởi tạo chính đối tượng Trang. Nó cũng được sử dụng để khởi tạo các phần tử lớp Trang mà không cần sử dụng "FindElement / s."

Ở đây, chúng tôi cũng tuân theo khái niệm tách biệt của Kho lưu trữ đối tượng trang và Phương pháp kiểm tra. Ngoài ra, với sự trợ giúp của lớp PageFactory trong Selenium, chúng tôi sử dụng chú thích @FindBy để tìm WebElement. Chúng tôi sử dụng phương thức initElements để khởi tạo các phần tử web

@FindBy có thể chấp nhận tagName, partLinkText, tên, linkText, id, css, className, xpath làm thuộc tính.

Hãy xem ví dụ tương tự như trên bằng cách sử dụng Page Factory

Trang đăng nhập Guru99 với Nhà máy trang

gói PageFactory;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.WebElement;nhập org.openqa.selenium.support.FindBy;nhập org.openqa.selenium.support.PageFactory;lớp công khai Guru99Login {/ *** Tất cả các WebElements được xác định bằng chú thích @FindBy* /Trình điều khiển WebDriver;@FindBy (name = "uid")Người dùng WebElement99GuruName;@FindBy (tên = "mật khẩu")Mật khẩu WebElement99Guru;@FindBy (className = "barone")WebElement titleText;@FindBy (name = "btnLogin")Đăng nhập WebElement;public Guru99Login (trình điều khiển WebDriver) {this.driver = trình điều khiển;// Phương thức initElements này sẽ tạo tất cả các WebElementsPageFactory.initElements (trình điều khiển, cái này);}// Đặt tên người dùng trong hộp văn bảnpublic void setUserName (String strUserName) {user99GuruName.sendKeys (strUserName);}// Đặt mật khẩu trong hộp văn bản mật khẩupublic void setPassword (String strPassword) {password99Guru.sendKeys (strPassword);}// Nhấp vào nút đăng nhậppublic void clickLogin () {login.click ();}// Lấy tiêu đề của Trang đăng nhậppublic String getLoginTitle () {trả về titleText.getText ();}/ *** Phương thức POM này sẽ được hiển thị trong trường hợp thử nghiệm để đăng nhập vào ứng dụng* @param strUserName* @param strPasword* @trở về* /public void loginToGuru99 (String strUserName, String strPasword) {// Điền tên người dùngthis.setUserName (strUserName);// Điền mật khẩuthis.setPassword (strPasword);// Nhấp vào nút Đăng nhậpthis.clickLogin ();}}

Trang chủ Guru99 với Nhà máy trang

gói PageFactory;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.WebElement;nhập org.openqa.selenium.support.FindBy;nhập org.openqa.selenium.support.PageFactory;lớp công khai Guru99HomePage {Trình điều khiển WebDriver;@FindBy (xpath = "// bảng // tr [@ class = 'header3']")WebElement homePageUserName;public Guru99HomePage (trình điều khiển WebDriver) {this.driver = trình điều khiển;// Phương thức initElements này sẽ tạo tất cả các WebElementsPageFactory.initElements (trình điều khiển, cái này);}// Lấy tên người dùng từ Trang chủpublic String getHomePageDashboardUserName () {trả về homePageUserName.getText ();}}

Guru99 TestCase với khái niệm Nhà máy Trang

gói thử nghiệm;nhập java.util.concurrent.TimeUnit;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.firefox.FirefoxDriver;nhập khẩu org.testng.Assert;nhập org.testng.annotations.BeforeTest;nhập org.testng.annotations.Test;nhập PageFactory.Guru99HomePage;nhập PageFactory.Guru99Login;public class Test99GuruLoginWithPageFactory {String driverPath = "C: \\ geckodriver.exe";Trình điều khiển WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@Trước khi kiểm trapublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = new FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Bài kiểm tra này truy cập http://demo.guru99.com/V4/* Xác minh tiêu đề trang đăng nhập là ngân hàng guru99* Đăng nhập vào ứng dụng* Xác minh trang chủ bằng tin nhắn Trang tổng quan* /@Test (ưu tiên = 0)public void test_Home_Page_Appear_Correct () {// Tạo đối tượng Trang đăng nhậpobjLogin = new Guru99Login (trình điều khiển);// Xác minh tiêu đề trang đăng nhậpString loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Chứa ("ngân hàng guru99"));// đăng nhập vào ứng dụngobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// chuyển sang trang tiếp theoobjHomePage = new Guru99HomePage (trình điều khiển);// Xác minh trang chủAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Chứa ("id manger: mgr123"));}}

Cấu trúc dự án hoàn chỉnh sẽ giống như sơ đồ:

AjaxElementLocatorFactory

AjaxElementLocatorFactory là một khái niệm tải chậm của PageFactory trong Selenium. Nó được sử dụng để tìm các phần tử web chỉ khi các phần tử được sử dụng trong bất kỳ hoạt động nào. Nó chỉ định thời gian chờ cho WebElements cho lớp trang đối tượng. Một trong những ưu điểm chính của việc sử dụng mẫu PageFactory trong Selenium là Lớp AjaxElementLocatorFactory.

Ở đây, khi một thao tác được thực hiện trên một phần tử, việc chờ đợi cho khả năng hiển thị của nó chỉ bắt đầu từ thời điểm đó. Nếu phần tử không được tìm thấy trong khoảng thời gian nhất định, việc thực thi Test Case sẽ đưa ra ngoại lệ 'NoSuchElementException'.

Tóm lược

  1. Mô hình Đối tượng Trang trong Selenium Websdriver là một mẫu thiết kế Kho lưu trữ Đối tượng.
  2. Mô hình đối tượng trang Selenium tạo mã thử nghiệm của chúng tôi có thể bảo trì, có thể tái sử dụng.
  3. Page Factory là một cách tối ưu hóa để tạo kho lưu trữ đối tượng trong khái niệm khung Mô hình Đối tượng Trang.
  4. AjaxElementLocatorFactory là một khái niệm tải lười biếng trong Page Factory - mẫu thiết kế đối tượng trang để xác định các WebElements chỉ khi chúng được sử dụng trong bất kỳ hoạt động nào.

Tải xuống Tệp dự án Selenium cho Demo trong Hướng dẫn này