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就可以了。

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

  1. 《一头扎进》系列之Python+Selenium自动化测试框架实战篇6 - 价值好几K的框架,呦!这个框架还真牛叉哦!!!

    1. 简介 本文开始介绍如何通过unittest来管理和执行测试用例,这一篇主要是介绍unittest下addTest()方法来加载测试用例到测试套件中去.用addTest()方法来加载我们测试用例到 ...

  2. Java+Selenium3自动化测试框架设计系列--href="javascript:void(0)"如何获得元素定位

    经过前面两篇文章的铺 垫,我们这篇介绍,webdriver如何处理,一个浏览器上多个窗口之间切换的问题.我们先脑补这样一个测试场景,你在页面A点击一个连接,会在新的 tab窗口打开页面B,这个时候,你 ...

  3. 《手把手教你》系列基础篇(七十七)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试- 上篇(详解教程)

    1.简介 今天主要是讲解和分享:TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用dependsOnMethods,testNG会自动根据@Test方法名称 ...

  4. 《手把手教你》系列基础篇(八十七)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-上篇(详解教程)

    1.简介 Apache Log4j 是一个非常古老的日志框架,并且是多年来最受欢迎的日志框架. 它引入了现代日志框架仍在使用的基本概念,如分层日志级别和记录器. 2015 年 8 月 5 日,该项目管 ...

  5. 《手把手教你》系列基础篇(七十八)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试- 中篇(详解教程)

    1.简介 上一篇讲解了依赖测试的各种方法,今天继续讲解依赖测试的方法,这一篇主要是讲解和分享通过xml文件配置组名依赖方法( 主要是测试组的用法).废话不说,直接上干货. 2.实例 测试组:一个组可包 ...

  6. 《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)

    1.简介 上一篇介绍了POM的基础理论知识和非POM方式写脚本,这篇介绍利用页面工厂类(page factory)去实现POM,通过查看PageFactory类,我们可以知道它是一个初始化一个页面实例 ...

  7. 《手把手教你》系列技巧篇(二十七)-java+ selenium自动化测试- quit和close的区别(详解教程)

    1.简介 尽管有的小伙伴或者童鞋们觉得很简单,不就是关闭退出浏览器,但是宏哥还是把两个方法的区别说一下,不然遇到坑后根本不会想到是这里的问题. 2.源码 本文介绍webdriver中关于浏览器退出操作 ...

  8. 《手把手教你》系列技巧篇(二十九)-java+ selenium自动化测试- Actions的相关操作上篇(详解教程)

    1.简介 有些测试场景或者事件,Selenium根本就没有直接提供方法去操作,而且也不可能把各种测试场景都全面覆盖提供方法去操作.比如:就像鼠标悬停,一般测试场景鼠标悬停分两种常见,一种是鼠标悬停在某 ...

  9. 《手把手教你》系列技巧篇(三十七)-java+ selenium自动化测试-日历时间控件-上篇(详解教程)

    1.简介 我们在实际工作中,有可能遇到有些web产品,网页上有一些时间选择,然后支持按照不同时间段范围去筛选数据.网页上日历控件一般,是一个文本输入框,鼠标点击,就会弹出日历界面,可以选择具体日期.这 ...

随机推荐

  1. Memcached 服务分布式集群如何实现?

    特殊说明:Memcached 集群和 web 服务集群是不一样的,所有 Memcached 的数据总和才是数据库的数据.每台 Memcached 都是部分数据.(一台 memcached 的数据,就是 ...

  2. 为什么要用Spring

    1.方便解耦,简化开发 通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合.有了Spring,用户不必再为单实例模式类.属性文件解析 ...

  3. 【freertos】006-任务切换实现细节

    前言 任务调度实现的两个核心: 调度器实现:(上一章节已描述调度基础) 任务切换实现. 接口层实现. 原文:李柱明博客:https://www.cnblogs.com/lizhuming/p/1608 ...

  4. 遇到过的问题之“解决 No qualifying bean of type 问题”

    1.问题 解决 No qualifying bean of type 问题 2.思路: 1 检查是否添加了对应注解 2 检查配置是否正确,扫描包名, 类名及id是否正确 一 . 传统SSM项目 ssm ...

  5. 决策树3:基尼指数--Gini index(CART)

    既能做分类,又能做回归.分类:基尼值作为节点分类依据.回归:最小方差作为节点的依据. 节点越不纯,基尼值越大,熵值越大 pi表示在信息熵部分中有介绍,如下图中介绍 方差越小越好. 选择最小的那个0.3 ...

  6. 16_伯德图_手绘技巧与应用_Bode Plot_Part2

  7. AngularJS的核心对象angular上的方法全面解析(AngularJS全局API)

    总结一下AngularJS的核心对象angular上的方法,也帮助自己学习一下平时工作中没怎么用到的方法,看能不能提高开发效率.我当前使用的Angularjs版本是1.5.5也是目前最新的稳定版本,不 ...

  8. 小程序 wx.getSystemInfoSync 获取 windowHeight 问题

    windowHeight 概念 可使用窗口高度,即:屏幕高度(screenHeight) - 导航(tabbar)高度 存在问题 安卓设备下获取 windowHeight 不能准确得到对应的高度,总是 ...

  9. 前端调试利器 - Charles

    Docs 开发之 Charles 配置指南 1.下载与安装 charles-proxy-4.1.4 .dmg56.12 MB已存到云盘下载 2.激活 使用公司正版license 激活 安装证书 点击证 ...

  10. Python使用逻辑回归估算OR值

    第一种是统计学方法,需要用到 statsmodels包 statsmodels是统计和计量经济学的package,包含了用于参数评估和统计测试的实用工具 第二种是机器学习,需要使用sklearn中的L ...