基于Java+Selenium的WebUI自动化测试框架(九)-----基础页面类(BasePage)

  上篇我们写了java读取xml文件的类,实现了可以从xml文件读取元素的方式。那么,接下来我们需要考虑一个问题。我们拿了这些元素之后怎么去操作呢?

  先来看看我们手工测试的时候是怎么进行的。

  双击浏览器,打开网站(浏览器初始化),然后在打开的网页上进行一些操作(比如输入,点击什么的)。假如,我们根据每个页面来写一个类,这样的话如果有几百个页面,我们就要封装几百个类,这样做也是非常的麻烦和复杂!,也不利于自动化脚本的维护。

  进一步想想,其实我们在每个页面上所做的操作也就那么几种。(输入文字,点击,得到某元素的文字,查看某元素是否显示,切换frame,切换窗口,处理弹窗等等。)根据这些页面上操作的共性,我们可以设计一个基础页面类,使用这个基础页面类来对各个具体的页面进行实例化。那么基础页面类中的方法,我们就可以在实例化的具体页面中进行调用。

  由于目前我们只写了读取XML的类。因此,我们就先写一个支持XML读取的基础页面类。

package webui.xUtils;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.util.HashMap;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.testng.Reporter;

    //基础页面类 
    public class BasePageX extends UIExcutorImpl {    
        protected WebDriver driver;    
        protected String pageName;
        // 页面名称    
        protected String xmlPath;
        // 页面元素配置文件路径    
        protected HashMap<String, Position> positionMap;
        //存储页面元素信息    
        protected logUtil log = new logUtil(BasePageX.class); 
        Position position = null;
        public BasePageX(WebDriver driver, String pageName,String xmlName)  throws Exception {        
            super(driver);
            this.driver = driver;        
            this.pageName = pageName;        // 获取page.xml路径,page.xml在同级目录
            xmlPath = this.getClass().getResource("").getPath() + xmlName;    
            positionMap = XmlReadUtil.readXMLDocument(xmlPath, pageName);
            log.info("成功读取:" + pageName + "页面信息");
            Reporter.log("成功读取:" + pageName + "页面信息");
            }

        public void click(String positionName) throws Exception {        
            super.click(getPosition(positionName));    
            }     
        public void sendKey(String positionName, String value) throws Exception {        
            super.sendKey(getPosition(positionName), value);            
            }     
        public String getText(String positionName) throws Exception {        
            return super.getText(getPosition(positionName));    
            }     
        public String getAttribute(String positionName,String value) throws Exception {        
            return super.getAttribute(getPosition(positionName), value);    
            } 
        public WebElement getElement(String positionName) throws Exception {        
            return super.getElement(getPosition(positionName));    
            }     
        public boolean isElementDisplayed(String positionName) throws Exception {        
            return super.isElementDisplayed(getPosition(positionName));    
            }     
        @Override
        public void switchWindow(String title) {        
            super.switchWindow(title);    
            log.info("切换窗口");
            Reporter.log("切换窗口"+title);
            }     
        public void switchFrame(String positionName) {        
            super.switchFrame(getPosition(positionName));    
            log.info("切换frame至:" + positionName);
            Reporter.log("切换frame至:" + positionName);
            }     
        @Override
        public String getAlertText() {
            return super.getAlertText();
        }
     //使用Robot强制点击某处坐标,用于无法定位的元素,比如(Object类型的元素)
public void mouseMoveClick(int x , int y) throws AWTException { Robot rb1 = new Robot(); rb1.mouseMove(x,y); rb1.delay(500); rb1.mousePress(InputEvent.BUTTON1_DOWN_MASK); rb1.delay(500); rb1.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); rb1.delay(500); log.info("将鼠标移动至:" + "(" + x +"," + y + ")"); Reporter.log("将鼠标移动至:" + "(" + x +"," + y + ")"); } public void jsClick(String positionName) throws Exception { super.jsClick(getPosition(positionName)); } public void waitElement(String positionName,int sec) { super.waitElement(getPosition(positionName), sec); } /*根据positionName返回对应的position */ public Position getPosition(String positionName) { Position position = null; if (positionMap != null) { position = positionMap.get(positionName); } if(position ==null) { log.error("没有找到"+positionName+"页面元素"); Reporter.log("没有找到"+positionName+"页面元素"); } return position; } }

     这样,完成了基础页面类之后。我们可以使用以下的代码来定义一个页面的实例,然后使用该实例来调用基础页面类的方法,从而实现操作页面的目的。例如:

BasePageX loginPage = new BasePageX(driver,"loginPage",doc_XmlPath);
loginPage.click("登录");

 

posted on 2019-08-28 15:30  万春流 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/generalli2019/p/11424352.html

python+selenium+unittest的web测试框架编写 使用框架来对web页面进行自动化测试,提高测试效率,本篇只阐述框架的搭建,不简述如何下载python,selenium,和selenium的基本语法 框架图 control层:含各种控件,如Button、select等基本元件的操作 page层:将各类页面封装成类,并提供页面操作函数 case层:通过调用页面操作实现测试用例 control层 该层含三个类:basePage、browserEngine、logger类,分别为页面控件基本操作类,浏览器操作类,日志类 1.basePage类部分代码如下: 阅读详情

相关推荐

自动化测试】之PO模式介绍及案例

PO三层模式: 主要分三层: 1.base层(对象库层):page页面一些公共的方法。如:初始化、元素定位、点击、输入、获取文本、截图等方法; 2.page层(操作层):封装对元素的操作。将每个涉及的元素操作单独封装一个操作方法,然后根据需求组装操作步骤,如登录方法=输入帐号+输入密码+点击登录三个操作进行组装; 3.scripts层(业务层):导调用 page页面,使用单元测试框架对业务逻辑进行封装测试。如:实现登录,直接调用page组装的登陆方法即可。 三者的关系:page层继承base层,scrip

m0_70618214的博客 2032

BasePage.java

分页工具类!

BasePage,其他的页面继承自此类

BasePage,其他的页面继承自此类,访问时直接用base对象操作,或直接使用对象

Java+Selenium】使用数据驱动读取xml,csv文件

在上篇文章https://mp.csdn.net/editor/html/109625777中,我们已经实现了参数化,但是并没有实现数据和脚本的分离不利于维护,因此这篇就是为了实现数据和脚本分离的,不多说,直接上代码 一、文件数据提供程序接口 /** * 文件数据提供程序接口 */ public interface IData { public Object[][] getData(String caseName,String dataFile); public Object[][

八戒媳妇 609

java关于通用分页参数的传递方式

1.第一种,通过一个基础类,基础类中是所有类共有的属性,把pageSize和pageNum都放在基础类中,其他类全部继承基础类。 如下,QuestionActivitiQueryReq类继承BasePageBasePage类就是专门用来放分页参数的,需要分页的类就去继承该类,BasePage类是一个通用类,所以放在common公共模块。 前端传参时直接这么传即可,后端通过@RequestBody注解去解析 2.第二种,在路径上传参,后端通过request.getParamet.

weixin_38972910的博客 5585

web自动化实战之BasePage

背景 页面行为分类 什么是BasePage? 哪些页面行为可以被封装成basepage? 代码实战

weixin_44885027的博客 2068

HTTPStatus500 之jsp页面含时发生的500错误

在使用JSP含basepath时发生了一次500错误。 代码是没有错的,因为在其它页面调用没有出错过。那么是主文件出错了,看了一下刚写的页面全是静态内容,没什么的? 仔细阅读错误信息:  Page directive: illegal to have multiple occurrences of contentType with different values (old: text/h...

chenccsy的博客 7803

basepage封装

basepage封装basepage封装的目的basepage封装操作配置文件封装函数操作继承 basepage 接着上一篇 分层设计思想,进行了自动化测试框架 PO页面对象层、测试用例层、元素定位层 和 测试数据层 4层封装 然而,在真实项目中,仅有这4层封装,这个自动化测试框架还是不完善的。 自动化测试框架的常用功能: 1、补充用例、执行用例或筛选用例进行执行 2、对执行失败的用例进行重运行功能(用例重运行机制) 3、生成测试报告 4、生成日志、运行失败进行截图 一个好的自动化测试框架,需要做到能减

沉觞的博客 3397

java界面ui自动化_基于Java+SeleniumWebUI自动化测试框架-----基础页面类BasePage)...

packagewebui.xUtils;importjava.awt.AWTException;importjava.awt.Robot;importjava.awt.event.InputEvent;importjava.util.HashMap;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;im...

weixin_39717026的博客 233

基于Java+SeleniumWebUI自动化测试框架(十三)-----基础页面类BasePage(Excel)

基于Java+SeleniumWebUI自动化测试框架(十三)-----基础页面类BasePage(Excel)   前面,我们讲了如何使用POI进行Excel的“按需读取”。根据前面我们写的BasePageX,我们可以很轻松的写出来基于这个“按需读取”的Base...

SHUAI1972的博客 418

从零搭建完整python自动化测试框架(UI自动化和接口自动化 )——持续更新

自动化测试框架采用python + unittest 的基础来搭建,采用PO模式、数据驱动的思想,通过selenium来实现WEB UI自动化,通过request来实现接口自动化。移动终端的自动化也可在该框架基础上去构建补充。

sunjice的博客 14万+

从零搭建完整python自动化测试框架(UI自动化和接口自动化

页面定义方式PO对象定义:京东主页面定义了搜索框和搜索按钮,以name为关键字,定义元素定位方式和执行的动作。{'name': 'search_ipt', 'desc': '搜索框', 'by': (By.ID, u'key'), 'action': 'send_keys()'},{'name': 'search_btn', 'desc': '搜索按钮', 'by': (By.CLASS_NAME, u'button'), 'action': 'click()'},测试数据定义方式。

weixin_67553250的博客 4994

特别好用的分页类PagingBase.java

特别好用的java分页类,

WEB-UI自动化测试主流框架对比(附封装方案)

通过这种封装,您可以提供一个易用、可维护且可扩展的测试框架,同时保留了底层Selenium的强大功能。这将大大减少编写和维护测试用例的时间,提高团队的效率。考虑到各个框架的优缺点,以及易用性和可扩展性,我建议基于Selenium或WebdriverIO进行封装。

载_酒i 1746

一种很轻松的Excel关键字方式进行网页Web自动化测试Java+Selenium+TestNG+Excel)

一种轻松的关键字(Java+Selenium+TestNG+Excel)Web自动化测试

weixin_43104848的博客 1094

Selenium+Pytest+Allure实现基于POM和数据驱动的功能自动化测试脚本开发

Selenium是一款开源的WebUI自动测试框架,支持多种浏览器,支持多种编程语言,但以PythonJava为主。

ICE_ek的博客 797

Selenium Python 框架BasePage页面封装写法

# -*- coding:utf-8 -*- # @Time : 2019-10-25 # @Author : carl_dj from public.common.log import Logger from config import globalparam from selenium.common.exceptions import NoSuchElementException im...

商务合作 | 面试培训 | 职场规划 ==>主页扫码 6396

使用 Selenium 构建的 BasePage

使用 Selenium 封装一个基础页面类 BasePage,并展示它的基本功能,括初始化浏览器、打开网页、查找元素、点击操作、输入文本以及异常处理等。通过封装 BasePage 类,可以更好地复用浏览器操作,提高测试脚本的可维护性和可读性。你可以根据项目需求进一步扩展这个基类,添加更多的通用方法。

weixin_43435891的博客 644
上一篇: 基于Java+Selenium的WebUI自动化测试框架(八)-----读取元素(XML文件)
下一篇: 基于Java+Selenium的WebUI自动化测试框架(十)-----读取Excel文件(JXL)
SHUAI1972
博客等级 码龄12年 19粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值