基于Java+Selenium的WebUI自动化测试框架(五)------页面操作实现类
在编写完Log类和监听类之后,终于要回到正轨上来了。我们继续开始写UIExcutor的实现类。
PS:如果你想让你的报告更加美观一些。推荐使用reportNG这个jar包。
在项目中导入reportng-1.1.5.jar,这个jar包网上可以找到。可是具体在哪里下载的我也忘了。。。。。这里先提一下,到后面我们再来详细的说明。
还记得我们之前写过的UIExcutor的接口吗?我们在这里需要一个一个的实现接口中的方法。(一个都不能少!)
package webui.xUtils; import java.util.Set; import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Reporter; public class UIExcutorImpl implements UIExcutor{
private WebDriver driver;
static logUtil logs = new logUtil(UIExcutorImpl.class);
public UIExcutorImpl(WebDriver driver) {
this.driver = driver;
}
public WebDriver getDriver() {
return driver;
}
public void setDriver(WebDriver driver) {
this.driver = driver;
}
//这里对接口中的方法进行重写,意味着当我们执行这些方法的时候,可以将过程步骤作为log记录下来,并加入report中。
@Override
public void click(Position position) throws Exception {
WebElement ele = getElement(position);
ele.click();
logs.info("click元素:"+position.getPositionName()+"["+"By."+position.getType()+":"+position.getPath()+"] success!");
//在Report中显示相应的log
Reporter.log("click元素:"+position.getPositionName()+"["+"By."+position.getType()+":"+position.getPath()+"] success!");
} @Override
public void sendKey(Position position, String value) throws Exception {
WebElement ele = getElement(position);
ele.sendKeys(value);
logs.info("input输入:"+position.getPositionName()+"["+"By."+position.getType()+":"+position.getPath()+" value:"+value+"]");
Reporter.log("input输入:"+position.getPositionName()+"["+"By."+position.getType()+":"+position.getPath()+" value:"+value+"]");
} @Override
public String getText(Position position) throws Exception {
WebElement ele = getElement(position);
String txt = ele.getText();
return txt;
} @Override
public WebElement getElement(Position position) throws Exception {
WebElement ele = null;
String path = position.getPath();
//这里私人指定的时间是3秒等待,用于页面元素的加载,需要根据实际情况进行设置
WebDriverWait wait = new WebDriverWait(driver, 3);
logs.info("查找元素:"+position.getPositionName()+"["+"By."+position.getType()+":"+path+"]");
Reporter.log("查找元素:"+position.getPositionName()+"["+"By."+position.getType()+":"+path+"]");
//使用switch-case分支语句来分别对应selenium八种定位方式
switch(position.getType()) {
case xpath:
try {
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(path)));
ele = driver.findElement(By.xpath(path));
}catch (Exception e) {
logs.error("findElment ByXpath:" + path + "-failed! NoSuchElement");
Reporter.log("findElment ByXpath:" + path + "-failed! NoSuchElement");
}
break;
case id:
try {
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.id(path)));
ele = driver.findElement(By.id(path));
}catch (Exception e) {
logs.error("findElement ById" + path + "-failed! NoSuchELement");
Reporter.log("findElement ById" + path + "-failed! NoSuchELement");
}
break;
case className:
try {
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.className(path)));
ele = driver.findElement(By.className(path));
}catch (Exception e) {
logs.error("findElement ByClassName" + path + "-failed! NoSuchElement");
Reporter.log("findElement ByClassName" + path + "-failed! NoSuchElement");
}
break;
case linkText:
try {
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.linkText(path)));
ele = driver.findElement(By.linkText(path));
}catch (Exception e) {
logs.error("findElement ByLinkText" + path + "-failed! NoSuchElement");
Reporter.log("findElement ByLinkText" + path + "-failed! NoSuchElement");
}
break;
case name:
try {
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.name(path)));
ele = driver.findElement(By.name(path));
}catch (Exception e) {
logs.error("findElement ByName" + path + "-failed! NoSuchElement");
Reporter.log("findElement ByName" + path + "-failed! NoSuchElement");
}
break;
case cssSelector:
try {
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector(path)));
ele = driver.findElement(By.cssSelector(path));
}catch (Exception e) {
logs.error("findElement ByCssSelector" + path + "-failed! NoSuchElement");
Reporter.log("findElement ByCssSelector" + path + "-failed! NoSuchElement");
}
case tagName:
try {
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.tagName(path)));
ele = driver.findElement(By.tagName(path));
}catch (Exception e) {
logs.error("findElement ByTagName" + path + "-failed ! NoSuchElement");
Reporter.log("findElement ByTagName" + path + "-failed ! NoSuchElement");
}
case partialLinkText:
try {
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.partialLinkText(path)));
ele = driver.findElement(By.partialLinkText(path));
}catch (Exception e) {
logs.error("findElement By partialLinkText" + path + "-failed ! NoSuchElement");
Reporter.log("findElement By partialLinkText" + path + "-failed ! NoSuchElement");
} default:
break;
}
return ele;
} @Override
public boolean isElementDisplayed(Position position) throws Exception {
WebElement ele = getElement(position);
boolean flag = ele.isDisplayed();
return flag;
} @Override
public void switchWindow(String winTitle) {
logs.info("切换windows窗口:" + winTitle);
Reporter.log("切换windows窗口:" + winTitle);
Set<String> handles = driver.getWindowHandles();
for (String handle : handles) {
if (handle.equals(driver.getWindowHandle())) {
continue;
} else {
driver.switchTo().window(handle);
if (winTitle.contains(driver.getTitle())) {
break;
} else {
continue;
}
}
}
} @Override
public void switchFrame(Position position) {
driver.switchTo().frame(position.getPath());
} @Override
public void waitElement(Position position , int sec) {
WebDriverWait wait = new WebDriverWait(driver, sec);
String add = position.getPath();
switch (position.getType()) {
case id:
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.id(add)));
break;
case xpath:
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(add)));
break;
case name:
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(add)));
break;
case linkText:
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(add)));
break;
case className:
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(add)));
break;
case tagName:
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(add)));
break;
case partialLinkText:
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(add)));
break;
case cssSelector:
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(add)));
break;
default:
break;
}
} @Override
public String getAlertText() {
String alertText = "";
try {
// webdriver对弹框的处理略坑,所以先等待2s再切换到弹框,否则可能无法切换
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Alert alert = driver.switchTo().alert();
alertText = alert.getText();
alert.accept();
} catch (NoSuchElementException e) {
logs.error("no alert open,switch to alert failed");
Reporter.log("no alert open,switch to alert failed");
}
return alertText;
} @Override
//获取元素属性值(提供属性名,比如要获取什么属性(比如:value),这里就要输入什么的值)
public String getAttribute(Position position , String attributeName) throws Exception {
WebElement ele = getElement(position);
String value = ele.getAttribute(attributeName);
return value;
}
@Override
//有些元素可以通过javaScript调用来强制点击某个元素
public void jsClick(Position position) throws Exception {
WebElement ele = getElement(position);
((JavascriptExecutor)driver).executeScript("arguments[0].click();", ele);
logs.info("JavaScript-click元素:"+position.getPositionName()+"["+"By."+position.getType()+":"+position.getPath()+"] success!");
Reporter.log("JavaScript-click元素:"+position.getPositionName()+"["+"By."+position.getType()+":"+position.getPath()+"] success!");
} }
通过以上的代码,对于之前的接口中的方法都进行了实现。
可以看出,我们实际上是对selenium提供的api进行了重写,加入了自己定义的内容。这是一个思路,即可以调用原生api来进行重写,实现自己的自定义内容。
那么页面元素操作的实现类完成了之后,是不是就可以开始自动化脚本的编写了呢?当然不是,我们还得考虑一个问题,就是浏览器。下次,我们会针对浏览器写一个类,进行浏览器的初始化。
基于Java+Selenium的WebUI自动化测试框架(五)------页面操作实现类的更多相关文章
- 基于Java+Selenium的WebUI自动化测试框架(八)-----读取元素(XML文件)
我们继续回到自动化测试框架的主线上来,在前面的文章中,我们定义一个页面元素的主要参数有:路径,找寻方式,等待时间,名称,这个四个参数.另外,我们还需要考虑一个问题,就是网站的页面. 举个例子来说,如果 ...
- 基于Java+Selenium的WebUI自动化测试框架(一)---页面元素定位器
对于自动化测试,尤其是UI的自动化测试.是很多做黑盒功能测试的同学,入门自动化测试一个最为直观的或者说最容易理解的途径之一. 对于手工测试和自动化测试的优劣,网上有很多论述,在这里不作展开讨论.但是, ...
- 基于Java+Selenium的WebUI自动化测试框架(十四)-----使用TestNG的Sample
到目前为止,我们所写的东西,都是集中在如何使用Selenium和Java来定位和读取元素.那么,到底如何具体开展测试,如何实现参数化,如何实现判定呢?下面,我们来看看Java应用程序的测试框架吧. 当 ...
- 基于Java+Selenium的WebUI自动化测试框架(六)---浏览器初始化
本篇我们来讨论,如何写一个浏览器初始化的类.在写之前,先思考一下,我们需要一个什么样的初始化? 先来看看使用原生的Java + selenium是怎么做的.(以firefox为例) System.se ...
- 基于Java+Selenium的WebUI自动化测试框架(十三)-----基础页面类BasePage(Excel)
前面,我们讲了如何使用POI进行Excel的“按需读取”.根据前面我们写的BasePageX,我们可以很轻松的写出来基于这个“按需读取”的BasePage. package webui.xUtils; ...
- 基于Java+Selenium的WebUI自动化测试框架(十)-----读取Excel文件(JXL)
之前,我们使用了读取XML文件的方式来实现页面元素的读取,并做成了基础页面类.下面,我们来进行一些扩展,通过Excel来读取页面元素. Excel的使用,大多数人应该都不陌生.那么Java读取Exce ...
- 基于Java+Selenium的WebUI自动化测试框架(九)-----基础页面类(BasePage)
上篇我们写了java读取xml文件的类,实现了可以从xml文件读取元素的方式.那么,接下来我们需要考虑一个问题.我们拿了这些元素之后怎么去操作呢? 先来看看我们手工测试的时候是怎么进行的. 双击浏览器 ...
- 基于Java+Selenium的WebUI自动化测试框架(四)-----设置监听类
基于上一篇的内容,这里我们开始写监听类Listener.我这里写监听类的思路是,继承TestListenerAdapter这个类,然后对其中的方法进行重写.网上也有很多资料,建议先学习一下,然后写出来 ...
- 基于Java+Selenium的WebUI自动化测试框架(三)------记录LOG
在有了Position类和接口类之后,我们是不是立刻就要着手开始写实现类了呢?按照一般的顺序是这样.但是,我们这里先停一下.原因有二: 1)既然是写一个框架,我们希望总体的功能上是全面的.实现类中,我 ...
随机推荐
- ACS712电流传感器应用
1. 原理图 其中第7脚输出的是电压值,那么电压值和测量的电流什么关系?看下图,有3个量程,我用的是20A电流的,100mv电压对应1A电流 看下图,不同的温度会有影响,不过区别不大 最后计算的公式是 ...
- Python3-ibm_db模块-数据库操作之DB2
官方文档 https://www.ibm.com/support/knowledgecenter/SSEPGG_9.5.0/kc_gen/developing-gen1.html 模块安装 Windo ...
- java-socket-demo的实现
目录 前言 IO通讯模型 IO通讯模型简介 1. 阻塞式同步IO 2. 非阻塞式同步IO 3. 多路复用IO(阻塞+非阻塞) 4. 异步IO Java对IO模型的支持 注意点及实现方案 TCP粘包/拆 ...
- extract()函数:用于从一个date或者interval类型中截取到特定的部分
extract()函数:用于从一个date或者interval类型中截取到特定的部分 ### extract 语法extract ( { year | month | day | hour | min ...
- 封装transform函数(设置和获取transform的属性和属性值)
(function (w) { /** * 设置或者获取元素的transform属性值 * @param node 要设置的元素 * @param param 变换属性: translate\scal ...
- 使用jetpack 4.2.2对jetson tx2进行刷机
一.前言 加班加点几天今天终于成功刷机,记录一下成功的一些过程,以方便同样卡住的朋友参考. 延续官网教程[1]中对设备的叫法,pc机称为host,tx2称为target. 二.过程 1. host相关 ...
- SpringBoot项目集成PageHelper使用
SpringBoot项目集成PageHelper使用 一.开始 地址:https://github.com/pagehelper/Mybatis-PageHelper 在spring boot ...
- Spyder中报错: Check failed: PyBfloat16_Type.tp_base != nullptr
报错问题: 问题1:tensorflow/python/lib/core/bfloat16.cc:675] Check failed: PyBfloat16_Type.tp_base != nullp ...
- 剑指offer13:数组[奇数,偶数],奇数偶数相对位置不变。
1. 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 2. 思路和方 ...
- 你不知道的 JSON.stringify() 的威力
掘进:https://juejin.im/post/5decf09de51d45584d238319?utm_source=gold_browser_extension#heading-19 gith ...