Playwright(Java版) - 7: Playwright 页面临象模子(POM)

[复制链接]
发表于 2024-11-24 12:57:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
页面临象模子(Page Object Model, 简称 POM)是一种用于提升测试代码可维护性和可读性的计划模式。在自动化测试中,POM 通过将页面元素及其操纵封装为对象,简化了测试用例的编写并进步了代码复用性。
  1 什么是页面临象模子?

页面临象模子是一种基于对象的计划模式,用于将页面的结构和行为封装为独立的类。每个页面类代表一个特定的页面或组件,包含以下内容:


  • 页面元素: 页面的 DOM 元素(例如输入框、按钮等)。
  • 页面行为: 操纵这些元素的方法(例如填写表单、点击按钮等)。
POM 的核心头脑是通过分离测试逻辑和页面细节,提升代码的可维护性和复用性。
POM 的优点:

  • 进步代码复用性: 页面操纵方法可以被多个测试用例复用。
  • 低落维护本钱: 页面结构发生变化时,只需更新对应的页面类。
  • 提升可读性: 测试用例更专注于测试逻辑,而不是底层页面实现细节。

2 利用 POM 优化测试代码结构

POM 实现的基本步骤:

  • 创建页面类,用于封装页面元素及操纵。
  • 将页面类与测试用例分离。
  • 在测试用例中调用页面类的方法完成操纵。
目录结构:
  1. src/test/java
  2. ├── pages/
  3. │   ├── LoginPage.java
  4. │   ├── RegistrationPage.java
  5. │   └── ProductPage.java
  6. └── tests/
  7.     ├── LoginTests.java
  8.     ├── RegistrationTests.java
  9.     └── ProductTests.java
复制代码

3 在 POM 中集成 Playwright

以下是 POM 在 Playwright 中的具体实现步骤:
1. 创建页面类

以登录页面为例:
  1. package pages;
  2. import com.microsoft.playwright.Page;
  3. public class LoginPage {
  4.     private final Page page;
  5.     // 构造函数
  6.     public LoginPage(Page page) {
  7.         this.page = page;
  8.     }
  9.     // 页面元素
  10.     private final String usernameInput = "#username";
  11.     private final String passwordInput = "#password";
  12.     private final String loginButton = "button[type='submit']";
  13.     // 页面操作方法
  14.     public void navigateToLoginPage(String url) {
  15.         page.navigate(url);
  16.     }
  17.     public void enterUsername(String username) {
  18.         page.fill(usernameInput, username);
  19.     }
  20.     public void enterPassword(String password) {
  21.         page.fill(passwordInput, password);
  22.     }
  23.     public void clickLoginButton() {
  24.         page.click(loginButton);
  25.     }
  26.     public String getWelcomeMessage() {
  27.         return page.textContent("h1");
  28.     }
  29. }
复制代码
2. 在测试用例中利用页面类

创建一个测试类 LoginTests.java,并调用 LoginPage 的方法完成测试:
  1. package tests;
  2. import com.microsoft.playwright.*;
  3. import org.testng.annotations.*;
  4. import pages.LoginPage;
  5. public class LoginTests {
  6.     private Playwright playwright;
  7.     private Browser browser;
  8.     private BrowserContext context;
  9.     private Page page;
  10.     private LoginPage loginPage;
  11.     @BeforeClass
  12.     public void setup() {
  13.         playwright = Playwright.create();
  14.         browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false));
  15.         context = browser.newContext();
  16.         page = context.newPage();
  17.         loginPage = new LoginPage(page);
  18.     }
  19.     @AfterClass
  20.     public void tearDown() {
  21.         page.close();
  22.         context.close();
  23.         browser.close();
  24.         playwright.close();
  25.     }
  26.     @Test
  27.     public void testValidLogin() {
  28.         loginPage.navigateToLoginPage("https://example.com/login");
  29.         loginPage.enterUsername("testuser");
  30.         loginPage.enterPassword("password123");
  31.         loginPage.clickLoginButton();
  32.         String welcomeMessage = loginPage.getWelcomeMessage();
  33.         assert welcomeMessage.equals("Welcome, testuser!");
  34.     }
  35. }
复制代码

-

功能形貌:
实现一个支持多语言登录页面的 POM 模块,包罗以下功能:

  • 输入用户名和暗码。
  • 切换语言。
  • 验证登录后是否乐成。
页面类实现:

  1. package pages;
  2. import com.microsoft.playwright.Page;
  3. public class MultiLangLoginPage {
  4.     private final Page page;
  5.     // 构造函数
  6.     public MultiLangLoginPage(Page page) {
  7.         this.page = page;
  8.     }
  9.     // 页面元素
  10.     private final String usernameInput = "#username";
  11.     private final String passwordInput = "#password";
  12.     private final String loginButton = "button[type='submit']";
  13.     private final String languageSelector = "#language-dropdown";
  14.     // 页面操作方法
  15.     public void selectLanguage(String language) {
  16.         page.selectOption(languageSelector, language);
  17.     }
  18.     public void enterCredentials(String username, String password) {
  19.         page.fill(usernameInput, username);
  20.         page.fill(passwordInput, password);
  21.     }
  22.     public void clickLoginButton() {
  23.         page.click(loginButton);
  24.     }
  25.     public boolean isLoginSuccessful() {
  26.         return page.isVisible("text=Welcome");
  27.     }
  28. }
复制代码
测试类实现:

  1. package tests;
  2. import com.microsoft.playwright.*;
  3. import org.testng.annotations.*;
  4. import pages.MultiLangLoginPage;
  5. public class MultiLangLoginTests {
  6.     private Playwright playwright;
  7.     private Browser browser;
  8.     private BrowserContext context;
  9.     private Page page;
  10.     private MultiLangLoginPage loginPage;
  11.     @BeforeClass
  12.     public void setup() {
  13.         playwright = Playwright.create();
  14.         browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false));
  15.         context = browser.newContext();
  16.         page = context.newPage();
  17.         loginPage = new MultiLangLoginPage(page);
  18.     }
  19.     @AfterClass
  20.     public void tearDown() {
  21.         page.close();
  22.         context.close();
  23.         browser.close();
  24.         playwright.close();
  25.     }
  26.     @Test
  27.     public void testLoginInEnglish() {
  28.         loginPage.selectLanguage("en");
  29.         loginPage.enterCredentials("testuser", "password123");
  30.         loginPage.clickLoginButton();
  31.         assert loginPage.isLoginSuccessful();
  32.     }
  33.     @Test
  34.     public void testLoginInFrench() {
  35.         loginPage.selectLanguage("fr");
  36.         loginPage.enterCredentials("utilisateur", "motdepasse");
  37.         loginPage.clickLoginButton();
  38.         assert loginPage.isLoginSuccessful();
  39.     }
  40. }
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表