Page Object设计模式详解

一、什么是Page Object?

Page Object是一种将页面之间相应的元素放在一个类里面统一管理的设计模式。Page Object测试框架的出现解决了传统UI测试框架中用户界面UI发生变化时,需要对大量测试用例进行重构的问题。它通过建立一个抽象层,将页面元素抽象成对象。并将页面行为抽象为方法,减少了代码冗余度及测试维护成本。

优点:

1、易于维护。在应用程序的修改过程中,由于分层模式,多大部分情况下修改只需要更改页面对象类中的方法即可。

2、易于扩展。随着应用程序测试的深入,Page Object也将不断地扩展。

3、耦合性低。不同的Page Object操作的是不同的页面,因此不同的Page Object之间是解耦合的。

设计思路:

Page Object设计模式是将业务逻辑和页面元素的操作分离开来。page object作为一个独立的组件可以更好的满足当前需求的变化,降低易变度,同时提高复用度,增加可读性。

二、如何设计Page Object模式

Page Object是由实现Page 的存储库、浏览器操作和测试脚本组成的。基于page object模式,我们将页面元素的定位和操作进行了封装,当页面元素发生变化时,我们只需要修改页面对象中的方法即可。

1、页面类。每一个页面设置一个独立的页面类,并继承Page类,每一个页面都有唯一一个URL。

 public class BasePage {
    public BasePage(){
         PageFactory.initElements(LcmUtil.getWebdriver(), this);
    }
}
    
public class LoginPage extends BasePage {
    String url;
    WebDriver driver;
    public LoginPage(WebDriver driver){
         this.driver = driver;
         url = "";
    }
    public void navigate () {
        driver.navigate().to(this.url);
    }
}

2、页面方法。封装页面的方法,并使用@FindBy注解进行定位。

public class LoginPage extends BasePage {
    @FindBy(xpath="//input[@name='username']") 
    WebElement nameField;
    @FindBy(xpath="//input[@name='password']") 
    WebElement passwordField;
    @FindBy(xpath="//input[@name='submit']") 
    WebElement loginButton;
    String url;
    WebDriver driver;
    public LoginPage(WebDriver driver){
         this.driver = driver;
         url = "";
    }
    public void navigate () {
        driver.navigate().to(this.url);
    }
    public void login(String name, String password) {
        nameField.sendKeys(name);
        passwordField.sendKeys(password);
        loginButton.click();
    }
}

3、测试用例。测试用例中的代码简单易懂,与业务无关,不会产生重复测试代码、代码维护难度大等问题。

public class LoginTest extends TestCaseBase{
    @Test
    public void testLogin(){
        LoginPage loginPage = new LoginPage(driver);
        loginPage.navigate();
        loginPage.login("212895394@qq.com","123456");
       }
}

三、Page Object驱动测试的高效性

让我们来看看在没有使用Page Object时,当页面执行了修改操作时测试代码需要如何重构。

当一个Web表单16个输入项时,一个借助selenium RC浏览器驱动的Http watch结果大约有300行字符数量。TDD紧密结合页面的可扩展和可维护性,自然而然地就会迫使开发者去探索如何更好地测试这种Web 表单构造。Page Object的另一个好处是通过使用已有的页面元素定位方法,允许QA进行更多有价值的测试。我们想要新建一个User对象,由于表单中的输入项有很多,这时在QA的测试代码中,创建每个用户测试用例花费的时间比较长,但是如果使用Page Object,就可以大大缩减测试用例的编写时间和维护成本。
基于这个例子,我们可以看到:使用Page Object可以极大地提高测试代码的可读性,可维护性减少开发窗口。

四、用Page Object设计模式简化测试代码

在传统的测试方法中,如果我们想验证一个业务操作是否成功,需要编写很多定位元素的代码。而如果使用Page Object设计模式,则可以将定位的元素封装到一个页面类中,具体的实现不需要考虑具体的元素,这样在进行测试时只需要调用页面类方法就可以完成页面操作和验证。下面是Page Object设计模式在web UI自动化测试过程中的一个典型应用。

1、Page类。在页面类中,封装了页面的元素和方法,仅暴露必要的方法,增加了可重用性。

public class SortSearchPage extends BasePage {
    @FindBy(id="sort_div") private WebElement sortBtn;
    @FindBy(xpath="//a[contains(text(),'最新')]") private WebElement timeOption;
    @FindBy(id="search_input") private WebElement searchBtn;
    @FindBy(css=".search-form [type='submit']") private WebElement searchBtn1;
    @FindBy(id="search_str") private WebElement searchInput;
    public SortSearchPage(WebDriver driver) {
        super(driver);
    }
    public void sortItems() {
        sortBtn.click();
        timeOption.click();
    }
    public void search(String searchStr) {
        searchBtn.click();
        searchInput.sendKeys(searchStr);
        searchBtn1.submit();
    }
}

2、测试用例。测试用例中使用Page类,仅验证必要的部分,增加了可重用性。而在Page类中,封装了大量的细节,使得测试用例简洁明了。

public class SortAndSearchTest extends BaseTest{
    @Test
    public void testSortAndSearch(){
        SortSearchPage sortSearchPage = page.goToSortSearchPage();
        sortSearchPage.sortItems();
        sortSearchPage.search("test");
    }
}

五、还有什么需要我们注意的地方吗?

1、代码风格。Page Object不同的实现可能会有一定的差异,但是每个实现的代码风格是相似的。代码风格统一,让别人看代码更加容易。

2、元素定位方式。在使用Page Object模式时,需要注意使用稳定的定位方式,相对Xpath具有可读性更好的CSS选择器,建议优先使用CSS选择器。

3、Page Object VS Data Driver。Page Object是解决UI自动化测试平稳过渡的好方案,而Data Driver是另一种自动化测试的方案。在使用Data Driver的情况下,我们会使用外部文件来存储测试数据及其参数,而在使用Page Object的情况下,我们只需要将存储数据的部分从PageObject分离出来,使代码更具健壮性和高可维护性。

六、总结

通过Page Object设计模式的使用,可以使测试代码更加具有可读性和可维护性。同时它还允许我们将页面元素和测试逻辑分开,增强了测试的可重用性和稳定性。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/270248.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-16 13:36
下一篇 2024-12-16 13:36

相关推荐

  • 手机安全模式怎么解除?

    安全模式是一种手机自身的保护模式,它会禁用第三方应用程序并使用仅限基本系统功能。但有时候,安全模式会使你无法使用手机上的一些重要功能。如果你想解除手机安全模式,可以尝试以下方法: …

    编程 2025-04-28
  • Qt State Machine与状态机模式

    本文将介绍Qt State Machine和状态机模式在Qt中的实现。Qt提供了QStateMachine和QState两个类,可以方便地实现状态机模式,并且能有效地处理复杂的、多…

    编程 2025-04-27
  • 解决“anerroroccurred sorry, the page you are looking for is currently unavailable”

    这个错误提示通常出现在我们访问网站或者应用程序时,意味着这些页面和应用程序暂时无法正常运行。无论是作为用户还是作为开发人员,我们应该如何应对呢?下面从多个方面进行详细的阐述。 一、…

    编程 2025-04-27
  • 显示C++设计模式

    本文将详细介绍显示C++设计模式的概念、类型、优点和代码实现。 一、概念 C++设计模式是在软件设计阶段定义,用于处理常见问题的可重用解决方案。这些解决方案是经过测试和验证的,并已…

    编程 2025-04-27
  • Centos7进入单用户模式的解释

    本文将介绍如何在Centos7中进入单用户模式,并从以下几个方面进行详细的阐述。 一、Centos7进入单用户模式的解答 在Centos7中进入单用户模式需要执行以下步骤: 1. …

    编程 2025-04-27
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25

发表回复

登录后才能评论