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

相关文章
|
6月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
423 18
|
6月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
289 4
|
7月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
227 11
|
6月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
389 5
|
6月前
|
数据采集 运维 监控
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
本文系统解析爬虫与自动化核心技术,涵盖HTTP请求、数据解析、分布式架构及反爬策略,结合Scrapy、Selenium等框架实战,助力构建高效、稳定、合规的数据采集系统。
1047 62
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
|
7月前
|
运维 Linux 网络安全
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
227 4
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
411 4
|
9月前
|
运维 监控 安全
从实践到自动化:现代运维管理的转型与挑战
本文探讨了现代运维管理从传统人工模式向自动化转型的必要性与路径,分析了传统运维的痛点,如效率低、响应慢、依赖经验等问题,并介绍了自动化运维在提升效率、降低成本、增强系统稳定性与安全性方面的优势。结合技术工具与实践案例,文章展示了企业如何通过自动化实现运维升级,推动数字化转型,提升业务竞争力。
|
机器学习/深度学习 人工智能 运维
机器学习+自动化运维:让服务器自己修Bug,运维变轻松!
机器学习+自动化运维:让服务器自己修Bug,运维变轻松!
514 14
下一篇
开通oss服务