前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)

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

作者头像
北京-宏哥
发布2022-05-10 14:44:27
8200
发布2022-05-10 14:44:27
举报

1.简介

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

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

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

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

3.Selenium方法的二次封装

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

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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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就可以了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.简介
  • 2.为什么要定义一个页面基类呢?
  • 3.Selenium方法的二次封装
  • 4.测试页面基类
    • 4.1测试场景
      • 4.2代码设计
        • 4.3参考代码
          • 4.4运行代码
          • 5.小结
          相关产品与服务
          测试服务
          测试服务 WeTest 包括标准兼容测试、专家兼容测试、手游安全测试、远程调试等多款产品,服务于海量腾讯精品游戏,涵盖兼容测试、压力测试、性能测试、安全测试、远程调试等多个方向,立体化安全防护体系,保卫您的信息安全。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档