《手把手教你》系列基础篇(九十七)-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天前
|
前端开发 测试技术 Python
【Selenium全攻略】掌握这一工具,实现自动化测试的所有梦想
本文分享了使用Selenium进行UI自动化测试的全过程,包括开发环境部署、代码实现、思路分析和难点解析。作者通过一个实际案例,讲述了如何利用Selenium处理前端生成报告失败的问题,以及在UI自动化中定位元素和处理元素不唯一的情况。同时,文章强调了解决问题思路的重要性,鼓励读者开拓思维,寻找不同的解决方案。
49 4
【Selenium全攻略】掌握这一工具,实现自动化测试的所有梦想
|
9天前
|
Web App开发 编解码 Linux
使用Selenium自动化测试解决报告生成失败问题及Linux部署指南
这篇文章介绍了使用Selenium自动化测试解决报告生成失败问题的方法,包括Linux环境下的部署指南和代码实现。
17 1
使用Selenium自动化测试解决报告生成失败问题及Linux部署指南
|
10天前
|
存储 Ubuntu 安全
ROS2教程02 ROS2的安装、配置和测试
本文是关于ROS2(机器人操作系统2)的安装、配置和测试的教程。内容包括使用一键安装脚本快速安装ROS2 Humble版,手动安装步骤,设置语言环境、添加软件源、更新软件包、安装ROS2桌面版和开发工具,配置ROS2环境,创建工作空间,配置ROS2领域以避免网络冲突,以及如何删除ROS2。此外,还包括了测试ROS2是否安装成功的两个案例:基本的Topic通信测试和使用Turtlesim演示程序。适用于Ubuntu 22.04操作系统。
13 1
ROS2教程02 ROS2的安装、配置和测试
|
11天前
|
安全 Java
Java基础面试十四】、 封装的目的是什么,为什么要有封装?
这篇文章讨论了封装在面向对象编程中的目的,强调封装可以隐藏类的实现细节,通过方法控制对数据的访问,保证数据完整性,并提高代码的可维护性。
Java基础面试十四】、 封装的目的是什么,为什么要有封装?
|
15天前
|
开发框架 前端开发 Java
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
【8月更文挑战第12天】SpringBootWeb极速入门-实现一个简单的web页面01
34 3
【前端学java】SpringBootWeb极速入门-实现一个简单的web页面01
|
3天前
|
存储 Java 数据库
Java封装
Java封装
12 1
|
7天前
|
安全 Java 应用服务中间件
【Azure 应用服务】App Service中,为Java应用配置自定义错误页面,禁用DELETE, PUT方法
【Azure 应用服务】App Service中,为Java应用配置自定义错误页面,禁用DELETE, PUT方法
【Azure 应用服务】App Service中,为Java应用配置自定义错误页面,禁用DELETE, PUT方法
|
9天前
|
XML JavaScript 测试技术
Web自动化测试框架(基础篇)--HTML页面元素和DOM对象
本文为Web自动化测试入门指南,介绍了HTML页面元素和DOM对象的基础知识,以及如何使用Python中的Selenium WebDriver进行元素定位、操作和等待机制,旨在帮助初学者理解Web自动化测试中的关键概念和操作技巧。
27 1
|
9天前
|
XML Java 测试技术
Selenium WebDriver自动化测试(基础篇):不得不掌握的Java基础
关于Selenium WebDriver自动化测试的Java基础篇,涵盖了Java的变量、数据类型、字符串操作、运算符、流程控制、面向对象编程、关键字用法、权限修饰符、异常处理和IO流等基础知识点,为进行自动化测试提供了必要的Java语言基础。
12 1
|
9天前
|
测试技术 开发工具 虚拟化
iOS自动化测试方案(一):MacOS虚拟机保姆级安装Xcode教程
这篇文章提供了一份保姆级的教程,指导如何在MacOS虚拟机上安装Xcode,包括环境准备、基础软件安装以及USB扩展插件的使用,以实现iOS自动化测试方案的第一步。
15 0
iOS自动化测试方案(一):MacOS虚拟机保姆级安装Xcode教程

热门文章

最新文章