《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)

简介: 【7月更文挑战第15天】这是关于自动化测试框架中Selenium API二次封装的教程总结。教程中介绍了如何设计一个支持不同浏览器测试的页面基类(BasePage),该基类包含了对Selenium方法的二次封装,如元素的输入、点击、清除等常用操作,以减少重复代码。此外,页面基类还提供了获取页面标题和URL的方法。

这是在社区发布这一系列教程的最后一篇,总共100多篇,后续文章请移步:北京宏哥  的公众号进行阅读和学习,谢谢~


1.简介

  上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试。宏哥将这个叫做浏览器引擎类。这个类负责获取浏览器类型和启动不同浏览器,并做一些前提操作,例如:最大化浏览器窗口和,打开测试服务器地址。

  今天这篇宏哥打算介绍如何封装几个Selenium公共的方法到页面基类中去。首先宏哥给小伙伴或者童鞋们解释一下页面基类,看到基类,我们想起了继承。没错,在这个框架基于POM的思想上,我们需要利用继承的特点,来实现,减少我们重复代码量。

2.为什么要定义一个页面基类呢?

  我们已经知道或者了解POM,前边开头也介绍过,我们每个模块或者相关功能,都能在一个个页面类上去定义和写相关业务操作方法。但是由于很多页面,我们有些方法是相同的,例如:判断一个元素是否在页面显示,还有元素点击和输入操作,还有判断页面标题和页面地址等等,甚至,有些软件web不同页面有公共的元素。这些因素,决定了我们需要写一个页面父类,来定义一些公共的方法或者公共的元素,宏哥将这个页面父类称之为页面基类。

3.Selenium方法的二次封装

1.先按照如下图,创建一个BasePage的类,如下图所示:

2.将selenium的方法进行二次封装,这个类就叫页面基类。这个叫页面基类,以后POM里面每个页面新写的类都需要继承这个BasePage类。如下图所示:

3.BasePage的代码内容参考如下:

package framework;


import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;


/**

* @author 北京-宏哥

*

* @公众号:北京宏哥

*

* 《手把手教你》系列基础篇(九十七)-java+selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)

*

* 2022年4月29日

*/


public class BasePage {


   public static WebDriver driver;

   public static String pageTitle;

   public static String pageUrl;


   /*

    * 构造方法

    */

   protected BasePage(WebDriver driver) {

       BasePage.driver = driver;

   }


   /*

    * 在文本框内输入字符

    */

   protected void type(WebElement element, String text) {

       try {

           if (element.isEnabled()) {

               element.clear();

               Logger.Output(LogType.LogTypeName.INFO,

                       "Clean the value if any in " + element.toString() + ".");

               element.sendKeys(text);

               Logger.Output(LogType.LogTypeName.INFO, "Type value is: "

                       + text + ".");

           }

       } catch (Exception e) {

           Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + ".");

       }


   }


   /*

    * 点击元素,这里指点击鼠标左键

    */

   protected void click(WebElement element) {


       try {

           if (element.isEnabled()) {

               element.click();

               Logger.Output(LogType.LogTypeName.INFO,

                       "Element: " + element.toString() + " was clicked.");

           }

       } catch (Exception e) {

           Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + ".");

       }


   }


   /*

    * 在文本输入框执行清除操作

    */

   protected void clean(WebElement element) {


       try {

           if (element.isEnabled()) {

               element.clear();

               Logger.Output(LogType.LogTypeName.INFO,

                       "Element " + element.toString() + " was cleaned.");

           }

       } catch (Exception e) {

           Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + ".");

       }


   }


   /*

    * 判断一个页面元素是否显示在当前页面

    */

   protected void verifyElementIsPresent(WebElement element) {


       try {

           if (element.isDisplayed()) {

               Logger.Output(LogType.LogTypeName.INFO, "This Element "

                       + element.toString().trim() + " is present.");


           }

       } catch (Exception e) {

           Logger.Output(LogType.LogTypeName.ERROR, e.getMessage() + ".");

       }

   }


   /*

    * 获取页面的标题

    */

   protected String getCurrentPageTitle() {


       pageTitle = driver.getTitle();

       Logger.Output(LogType.LogTypeName.INFO, "Current page title is "

               + pageTitle);

       return pageTitle;

   }


   /*

    * 获取页面的url

    */

   protected String getCurrentPageUrl() {


       pageUrl = driver.getCurrentUrl();

       Logger.Output(LogType.LogTypeName.INFO, "Current page title is "

               + pageUrl);

       return pageUrl;

   }


}

从上面代码看到:宏哥实现了Selenium的元素判断是否显示,和元素清除,点击,输入等方法的二次封装。还有我们写了每个页面都存在的获取标题和url的方法。其他的方法,宏哥先不全部放上去进行封装,以后宏哥会慢慢完善BasePage这个基类。接下来,宏哥就需要在实现POM里去测试这个页面基类是否能够正常使用。

4.测试页面基类

4.1测试场景

宏哥就在这里用一个简单的测试场景:打开浏览器访问百度首页,然后在搜索框中输入“北京-宏哥”,最后点击“百度一下”按钮。测试场景简单这里测试用例就不再赘述了,直接进入主题:测试页面基类是否可以正常使用。

4.2代码设计

1.在pageObject包中,创建一个BaiduSearchPage类,如下图所示:

2.在testSuit包中,创建一个测试类:testBasePage,如下图所示:

4.3参考代码

(1)BaiduSearchPage.java

package pageObject;


import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.support.FindBy;


import framework.BasePage;


/**

* @author 北京-宏哥

*

* @公众号:北京宏哥

*

* 《手把手教你》系列基础篇(九十七)-java+selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)

*

* 2022年4月29日

*/


public class BaiduSearchPage extends BasePage{


   /*

    * 百度的首页,主要提供一些其他子模块或者页面的入口,一般点击一个元素,进入下一页面

    */

   

   /**

    * @param driver

    */

   public BaiduSearchPage(WebDriver driver) {

       super(driver);

       // TODO Auto-generated constructor stub

   }

   

   // 元素定位

   //搜索输入框

   @FindBy (id="kw")

   WebElement search_inputBox;

   

   //搜索提交按钮

   @FindBy (id="su")

   WebElement search_submitBtn;

   

   /*

    * 搜索框输入关键字,点击搜索

    */

   public void searchWithKeyword(String keyword){

       

       //继承页面基类里的输入和点击方法

       type(search_inputBox, keyword);

       click(search_submitBtn);


   }

   

}

(2)testBasePage.java

package testSuite;


import java.io.IOException;



import org.openqa.selenium.WebDriver;

import org.openqa.selenium.support.PageFactory;

import org.testng.annotations.AfterClass;

import org.testng.annotations.BeforeClass;

import org.testng.annotations.Test;


import pageObject.BaiduSearchPage;

import framework.BrowserEngine;


/**

* @author 北京-宏哥

*

* @公众号:北京宏哥

*

* 《手把手教你》系列基础篇(九十七)-java+selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)

*

* 2022年4月09日

*/


public class testBasePage {

   

public WebDriver driver;

   

   @BeforeClass

   public void setUp() throws IOException{

       

       BrowserEngine browserEngine = new BrowserEngine();

       browserEngine.initConfigData();

       driver=browserEngine.getBrowser();


   }

   

   @Test

   public void search() throws InterruptedException{


       BaiduSearchPage searchpage = PageFactory.initElements(driver, BaiduSearchPage.class);

       Thread.sleep(5000);

       searchpage.searchWithKeyword("北京-宏哥");


   }

   

   @AfterClass

   public void tearDown() throws InterruptedException{

       

       Thread.sleep(5000);

       driver.quit();


   }


}

4.4运行代码

1.运行代码,右键Run AS->TestNG Suite,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

5.小结

注意了,敲黑板!!!!在写代码的过程中 ,一个小问题耽误了好久,那就在类中,宏哥将那个super的方法给定义成protected的,这个是由于eclipse自带提示宏哥就默认了,没有想到是会影响后边的调用。结果一直报错如下:

解决办法:修改成public就可以了。


每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问):


Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

相关文章
|
9月前
|
人工智能 数据可视化 测试技术
Postman 性能测试教程:快速上手 API 压测
本文介绍API上线后因高频调用导致服务器告警,通过Postman与Apifox进行压力测试排查性能瓶颈。对比两款工具在批量请求、断言验证、可视化报告等方面的优劣,探讨API性能优化策略及行业未来发展方向。
Postman 性能测试教程:快速上手 API 压测
|
11月前
|
JSON JavaScript 测试技术
用Postman玩转电商API:一键测试+自动化请求教程
Postman 是电商 API 测试的高效工具,涵盖基础配置、自动化测试、环境管理与请求自动化,助你快速提升开发效率。
|
10月前
|
前端开发 Java jenkins
Jmeter压力测试工具全面教程和使用技巧。
JMeter是一个能够模拟高并发请求以检查应用程序各方面性能的工具,包括但不限于前端页面、后端服务及数据库系统。熟练使用JMeter不仅能够帮助发现性能瓶颈,还能在软件开发早期就预测系统在面对真实用户压力时的表现,确保软件质量和用户体验。在上述介绍的基础上,建议读者结合官方文档和社区最佳实践,持续深入学习和应用。
2022 10
|
9月前
|
存储 SQL 人工智能
selenium的封装技术
使用uite.addTest(classname(test_way))是为了第一个先运行"test_Register_Login"
233 0
|
9月前
|
监控 测试技术 API
n8n自动化测试教程 (1):环境搭建与初识n8n
n8n是一款开源、可视化的工作流自动化工具,测试工程师可通过拖拽节点快速构建API测试流程,实现测试编排、数据管理、自动化监控与告警等功能,提升测试效率与覆盖率。
|
10月前
|
JSON 安全 测试技术
什么是API接口测试?这可能是全网最全的教程了!
API 是应用程序间的“中间人”,用于实现通信和数据交换。随着微服务架构的普及,API 数量激增,其质量对系统稳定性至关重要。API 测试可验证功能、性能与安全性,帮助开发者在部署前发现并修复问题,提升系统可靠性。测试内容包括请求方法、URL、请求头、请求体、响应状态码与响应数据等。常用工具如 Postman、AREX 可辅助测试,确保 API 在不同场景下的正确性与稳定性。
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
1006 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
Web App开发 IDE JavaScript
Selenium IDE:Web自动化测试的得力助手
Selenium IDE:Web自动化测试的利器。作为开源工具,Selenium IDE支持录制与回放用户操作,适用于Chrome、Firefox等多浏览器,简化了测试流程,提升了效率,降低了自动化测试的门槛。它还支持导出多种编程语言的脚本,便于测试集成与复用。
518 31
Selenium IDE:Web自动化测试的得力助手
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
643 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
1341 17
Selenium:强大的 Web 自动化测试工具