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

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

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

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

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

  1. package webui.xUtils;
  2. import java.awt.AWTException;
  3. import java.awt.Robot;
  4. import java.awt.event.InputEvent;
  5. import java.util.HashMap;
  6.  
  7. import org.openqa.selenium.WebDriver;
  8. import org.openqa.selenium.WebElement;
  9. import org.testng.Reporter;
  10.  
  11. //基础页面类
  12. public class BasePageX extends UIExcutorImpl {
  13. protected WebDriver driver;
  14. protected String pageName;
  15. // 页面名称
  16. protected String xmlPath;
  17. // 页面元素配置文件路径
  18. protected HashMap<String, Position> positionMap;
  19. //存储页面元素信息
  20. protected logUtil log = new logUtil(BasePageX.class);
  21. Position position = null;
  22. public BasePageX(WebDriver driver, String pageName,String xmlName) throws Exception {
  23. super(driver);
  24. this.driver = driver;
  25. this.pageName = pageName; // 获取page.xml路径,page.xml在同级目录
  26. xmlPath = this.getClass().getResource("").getPath() + xmlName;
  27. positionMap = XmlReadUtil.readXMLDocument(xmlPath, pageName);
  28. log.info("成功读取:" + pageName + "页面信息");
  29. Reporter.log("成功读取:" + pageName + "页面信息");
  30. }
  31.  
  32. public void click(String positionName) throws Exception {
  33. super.click(getPosition(positionName));
  34. }
  35. public void sendKey(String positionName, String value) throws Exception {
  36. super.sendKey(getPosition(positionName), value);
  37. }
  38. public String getText(String positionName) throws Exception {
  39. return super.getText(getPosition(positionName));
  40. }
  41. public String getAttribute(String positionName,String value) throws Exception {
  42. return super.getAttribute(getPosition(positionName), value);
  43. }
  44. public WebElement getElement(String positionName) throws Exception {
  45. return super.getElement(getPosition(positionName));
  46. }
  47. public boolean isElementDisplayed(String positionName) throws Exception {
  48. return super.isElementDisplayed(getPosition(positionName));
  49. }
  50. @Override
  51. public void switchWindow(String title) {
  52. super.switchWindow(title);
  53. log.info("切换窗口");
  54. Reporter.log("切换窗口"+title);
  55. }
  56. public void switchFrame(String positionName) {
  57. super.switchFrame(getPosition(positionName));
  58. log.info("切换frame至:" + positionName);
  59. Reporter.log("切换frame至:" + positionName);
  60. }
  61. @Override
  62. public String getAlertText() {
  63. return super.getAlertText();
  64. }
         //使用Robot强制点击某处坐标,用于无法定位的元素,比如(Object类型的元素)
  65. public void mouseMoveClick(int x , int y) throws AWTException {
  66. Robot rb1 = new Robot();
  67. rb1.mouseMove(x,y);
  68. rb1.delay(500);
  69. rb1.mousePress(InputEvent.BUTTON1_DOWN_MASK);
  70. rb1.delay(500);
  71. rb1.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
  72. rb1.delay(500);
  73. log.info("将鼠标移动至:" + "(" + x +"," + y + ")");
  74. Reporter.log("将鼠标移动至:" + "(" + x +"," + y + ")");
  75. }
  76. public void jsClick(String positionName) throws Exception {
  77. super.jsClick(getPosition(positionName));
  78. }
  79. public void waitElement(String positionName,int sec) {
  80. super.waitElement(getPosition(positionName), sec);
  81. }
  82.  
  83. /*根据positionName返回对应的position
  84. */
  85. public Position getPosition(String positionName) {
  86. Position position = null;
  87. if (positionMap != null) {
  88. position = positionMap.get(positionName);
  89. }
  90. if(position ==null) {
  91. log.error("没有找到"+positionName+"页面元素");
  92. Reporter.log("没有找到"+positionName+"页面元素");
  93. }
  94. return position;
  95. }
  96.  
  97. }

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

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

基于Java+Selenium的WebUI自动化测试框架(九)-----基础页面类(BasePage)的更多相关文章

  1. 基于Java+Selenium的WebUI自动化测试框架(十三)-----基础页面类BasePage(Excel)

    前面,我们讲了如何使用POI进行Excel的“按需读取”.根据前面我们写的BasePageX,我们可以很轻松的写出来基于这个“按需读取”的BasePage. package webui.xUtils; ...

  2. 基于Java+Selenium的WebUI自动化测试框架(八)-----读取元素(XML文件)

    我们继续回到自动化测试框架的主线上来,在前面的文章中,我们定义一个页面元素的主要参数有:路径,找寻方式,等待时间,名称,这个四个参数.另外,我们还需要考虑一个问题,就是网站的页面. 举个例子来说,如果 ...

  3. 基于Java+Selenium的WebUI自动化测试框架(十)-----读取Excel文件(JXL)

    之前,我们使用了读取XML文件的方式来实现页面元素的读取,并做成了基础页面类.下面,我们来进行一些扩展,通过Excel来读取页面元素. Excel的使用,大多数人应该都不陌生.那么Java读取Exce ...

  4. 基于Java+Selenium的WebUI自动化测试框架(一)---页面元素定位器

    对于自动化测试,尤其是UI的自动化测试.是很多做黑盒功能测试的同学,入门自动化测试一个最为直观的或者说最容易理解的途径之一. 对于手工测试和自动化测试的优劣,网上有很多论述,在这里不作展开讨论.但是, ...

  5. 基于Java+Selenium的WebUI自动化测试框架(十四)-----使用TestNG的Sample

    到目前为止,我们所写的东西,都是集中在如何使用Selenium和Java来定位和读取元素.那么,到底如何具体开展测试,如何实现参数化,如何实现判定呢?下面,我们来看看Java应用程序的测试框架吧. 当 ...

  6. 基于Java+Selenium的WebUI自动化测试框架(六)---浏览器初始化

    本篇我们来讨论,如何写一个浏览器初始化的类.在写之前,先思考一下,我们需要一个什么样的初始化? 先来看看使用原生的Java + selenium是怎么做的.(以firefox为例) System.se ...

  7. 基于Java+Selenium的WebUI自动化测试框架(五)------页面操作实现类

    在编写完Log类和监听类之后,终于要回到正轨上来了.我们继续开始写UIExcutor的实现类. PS:如果你想让你的报告更加美观一些.推荐使用reportNG这个jar包. 在项目中导入reportn ...

  8. 基于Java+Selenium的WebUI自动化测试框架(四)-----设置监听类

    基于上一篇的内容,这里我们开始写监听类Listener.我这里写监听类的思路是,继承TestListenerAdapter这个类,然后对其中的方法进行重写.网上也有很多资料,建议先学习一下,然后写出来 ...

  9. 基于Java+Selenium的WebUI自动化测试框架(三)------记录LOG

    在有了Position类和接口类之后,我们是不是立刻就要着手开始写实现类了呢?按照一般的顺序是这样.但是,我们这里先停一下.原因有二: 1)既然是写一个框架,我们希望总体的功能上是全面的.实现类中,我 ...

随机推荐

  1. 汉字转拼音插件:LM-PinYin.js

    CDN:http://dtdxrk.github.io/jsPlug/pinyin/LM-PinYin.js demo演示地址:http://dtdxrk.github.io/jsPlug/pinyi ...

  2. CentOS7使用yum安装RabbitMQ

    转自:https://jingyan.baidu.com/article/456c463b16f3820a583144a1.html 登录名:admin   密码:admin 1. 如果安装后web界 ...

  3. 最新 企叮咚java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 企叮咚等10家互联网公司的校招Offer,因为某些自身原因最终选择了 企叮咚.6.7月主要是做系统复习.项目复盘.Leet ...

  4. Python 模块初始化的时候,发生了什么?

    假设有一个 hello.py 的模块,当我们从别的模块调用 hello.py 的时候,会发生什么呢? 方便起见,我们之间在 hello.py 的目录下使用 ipython 导入了. hello.py ...

  5. Python3 - 随便说一下

    Ⅰ编程语言基础知识 ⅡPython 语言概述 Ⅰ编程语言基础知识 编程语言总体分以为机器语言.汇编语言.高级语言: 机器语言:计算机硬件能够直接使用的编程语言,二进制的集合,属于低级语言. 汇编语言: ...

  6. Java中final与C++中const的关系

    Java中的final有三种主要用法: (1)修饰变量: final变量是不可改变的,但它的值可以在运行时刻初始化,也可以在编译时刻初始化,甚至可以放在构造函数中初始化,而不必在声明的时候初始化,所以 ...

  7. ASP.NET Core依赖注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来. 服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了 ...

  8. rabbitMQ 重试

    rabbitMQ 重试机制 spring.rabbitmq.listener.simple.retry.max-attempts=5 最大重试次数spring.rabbitmq.listener.si ...

  9. typeAliasesPackage 属性的作用

    applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...

  10. 在论坛中出现的比较难的sql问题:34(递归 获取连续值问题)

    原文:在论坛中出现的比较难的sql问题:34(递归 获取连续值问题) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.