《手把手教你》系列基础篇(九十七)-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工具基础使用教程

相关文章
AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架
AxBench 是由斯坦福大学推出,用于评估语言模型可解释性方法的基准测试框架,支持概念检测和模型转向任务,帮助研究者系统地比较不同控制技术的有效性。
39 5
AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架
pytest接口自动化测试框架搭建
通过上述步骤,我们成功搭建了一个基于 `pytest`的接口自动化测试框架。这个框架具备良好的扩展性和可维护性,能够高效地管理和执行API测试。通过封装HTTP请求逻辑、使用 `conftest.py`定义共享资源和前置条件,并利用 `pytest.ini`进行配置管理,可以大幅提高测试的自动化程度和执行效率。希望本文能为您的测试工作提供实用的指导和帮助。
116 15
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Midscene.js 是一款基于 AI 技术的 UI 自动化测试框架,通过自然语言交互简化测试流程,支持动作执行、数据查询和页面断言,提供可视化报告,适用于多种应用场景。
609 1
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
93 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
自动化测试之美:从Selenium到Appium
【10月更文挑战第3天】在软件开发的海洋中,自动化测试如同一艘航船,引领着质量保证的方向。本文将带你领略自动化测试的魅力,从Web端的Selenium到移动端的Appium,我们将一探究竟,看看这些工具如何帮助我们高效地进行软件测试。你将了解到,自动化测试不仅仅是技术的展示,更是一种提升开发效率和产品质量的智慧选择。让我们一起启航,探索自动化测试的世界!
自动化测试的利器:Selenium 框架深度解析
【10月更文挑战第2天】在软件开发的海洋中,自动化测试犹如一艘救生艇,让质量保证的过程更加高效与精准。本文将深入探索Selenium这一强大的自动化测试框架,从其架构到实际应用,带领读者领略自动化测试的魅力和力量。通过直观的示例和清晰的步骤,我们将一起学习如何利用Selenium来提升软件测试的效率和覆盖率。
自动化测试之美:如何利用Selenium实现Web应用的高效测试
【10月更文挑战第29天】在软件开发的世界中,测试是确保产品质量的关键步骤。本文将带你了解如何使用Selenium这一强大的自动化测试工具,提高Web应用测试的效率和准确性。通过实际案例,我们将探索Selenium的核心功能及其在现代软件开发中的应用,旨在帮助读者掌握自动化测试的精髓,从而提升软件测试工作的整体效能。
82 0
自动化测试的奥秘:如何用Selenium和Python提升软件质量
【9月更文挑战第35天】在软件开发的海洋中,自动化测试是那艘能引领我们穿越波涛的帆船。本文将揭开自动化测试的神秘面纱,以Selenium和Python为工具,展示如何构建一个简单而强大的自动化测试框架。我们将从基础出发,逐步深入到高级应用,让读者能够理解并实现自动化测试脚本,从而提升软件的质量与可靠性。
自动化测试的利剑:Selenium WebDriver入门与实践
【9月更文挑战第21天】在软件开发的海洋中,自动化测试犹如一艘船,帮助开发者们快速航行至质量保证的彼岸。本文将作为你的罗盘,指引你了解和掌握Selenium WebDriver这一强大的自动化测试工具。通过深入浅出的方式,我们将探索Selenium WebDriver的基本概念、安装过程以及编写简单测试脚本的方法。无论你是刚接触自动化测试的新手,还是希望提升测试技能的开发者,这篇文章都将为你提供有价值的指导。
自动化测试的利器:Selenium与Python的完美结合
【9月更文挑战第21天】在软件开发的世界里,测试是确保产品质量的关键步骤。随着敏捷开发和持续集成的流行,自动化测试工具变得尤为重要。本文将介绍如何使用Selenium和Python进行高效的自动化测试,不仅提供代码示例,还深入探讨如何设计测试用例、选择正确的测试框架、以及如何整合到CI/CD流程中。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。
90 3

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等