上篇我们写了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("登录");
基于Java+Selenium的WebUI自动化测试框架(九)-----基础页面类(BasePage)的更多相关文章
-
基于Java+Selenium的WebUI自动化测试框架(十三)-----基础页面类BasePage(Excel)
前面,我们讲了如何使用POI进行Excel的“按需读取”.根据前面我们写的BasePageX,我们可以很轻松的写出来基于这个“按需读取”的BasePage. package webui.xUtils; ...
-
基于Java+Selenium的WebUI自动化测试框架(八)-----读取元素(XML文件)
我们继续回到自动化测试框架的主线上来,在前面的文章中,我们定义一个页面元素的主要参数有:路径,找寻方式,等待时间,名称,这个四个参数.另外,我们还需要考虑一个问题,就是网站的页面. 举个例子来说,如果 ...
-
基于Java+Selenium的WebUI自动化测试框架(十)-----读取Excel文件(JXL)
之前,我们使用了读取XML文件的方式来实现页面元素的读取,并做成了基础页面类.下面,我们来进行一些扩展,通过Excel来读取页面元素. Excel的使用,大多数人应该都不陌生.那么Java读取Exce ...
-
基于Java+Selenium的WebUI自动化测试框架(一)---页面元素定位器
对于自动化测试,尤其是UI的自动化测试.是很多做黑盒功能测试的同学,入门自动化测试一个最为直观的或者说最容易理解的途径之一. 对于手工测试和自动化测试的优劣,网上有很多论述,在这里不作展开讨论.但是, ...
-
基于Java+Selenium的WebUI自动化测试框架(十四)-----使用TestNG的Sample
到目前为止,我们所写的东西,都是集中在如何使用Selenium和Java来定位和读取元素.那么,到底如何具体开展测试,如何实现参数化,如何实现判定呢?下面,我们来看看Java应用程序的测试框架吧. 当 ...
-
基于Java+Selenium的WebUI自动化测试框架(六)---浏览器初始化
本篇我们来讨论,如何写一个浏览器初始化的类.在写之前,先思考一下,我们需要一个什么样的初始化? 先来看看使用原生的Java + selenium是怎么做的.(以firefox为例) System.se ...
-
基于Java+Selenium的WebUI自动化测试框架(五)------页面操作实现类
在编写完Log类和监听类之后,终于要回到正轨上来了.我们继续开始写UIExcutor的实现类. PS:如果你想让你的报告更加美观一些.推荐使用reportNG这个jar包. 在项目中导入reportn ...
-
基于Java+Selenium的WebUI自动化测试框架(四)-----设置监听类
基于上一篇的内容,这里我们开始写监听类Listener.我这里写监听类的思路是,继承TestListenerAdapter这个类,然后对其中的方法进行重写.网上也有很多资料,建议先学习一下,然后写出来 ...
-
基于Java+Selenium的WebUI自动化测试框架(三)------记录LOG
在有了Position类和接口类之后,我们是不是立刻就要着手开始写实现类了呢?按照一般的顺序是这样.但是,我们这里先停一下.原因有二: 1)既然是写一个框架,我们希望总体的功能上是全面的.实现类中,我 ...
随机推荐
-
Android使用C++截屏并显示
使用android底层自带的截屏源码进行修改后,将截取屏幕的内容再次显示在屏幕上,使屏幕呈现出暂停的效果. android自带的截屏代码在android\JB\frameworks\base\cmds ...
-
Bootstrap栅格系统详解,响应式布局
Bootstrap栅格系统详解 栅格系统介绍 Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 栅格系统用于通 ...
-
swift 代码添加按钮
var btn = UIButton(frame: CGRect(x: 200, y: 200, width: 100, height: 100)) btn.setTitle("jichen ...
-
[转]javascript指定事件处理程序包括三种方式:
javascript指定事件处理程序包括三种方式: (1):DOM0级事件处理程序 如: 代码如下: var btn=document.getElementById("mybtn" ...
-
mysql之 mysql 5.6不停机主主搭建(活跃双主基于日志点复制)
环境说明:版本 version 5.6.25-log 主库ip: 10.219.24.25从库ip:10.219.24.22os 版本: centos 6.7已安装热备软件:xtrabackup 防火 ...
-
使用wget做站点镜像及wget的高级用法
本文为大家介绍 使用wget做站点镜像及wget的高级用法,供大家学习参考. # wget -r -p -np -k http://xxx.edu.cn -r 表示递归下载,会下载所有的链接,不过要注 ...
-
CSA Round #54 $\ $Voting
CSA Round #54 \(\ \)Voting 题目大意: 原题网址:戳我戳我! 一次歌唱比赛中,一位歌手刚刚结束表演,评委正在打分. 一共有 \(n\) 位评委,他们每人可以打 \(1\) 分 ...
-
2.Flask jinjia2模板
1.1.模板传参 (1)主程序 from flask import Flask,render_template app = Flask(__name__) @app.route('/') def he ...
-
Python实战二
要求:按照要求完成对文件的增.删.改.查操作. def add(**kwargs): '''新增内容,在指定位置新增''' while True: flag = False with open(&qu ...
-
【转】SQL Server日志文件过大 大日志文件清理方法 不分离数据库
https://blog.csdn.net/slimboy123/article/details/54575592 还未测试 USE[master] GO ALTER DATABASE 要清理的数据库 ...