Java+selenium之WebDriver的常用方法封装(八)
总结:WEB UI自动化测试一般采用 POP(面向页面编程),自动化测试框架分三层,有时如果页面如果太多,不好管理,可以面向控件编程,即把控件当作页面,毕竟控件是有限的,所以封装页面的代码量会少很多,两种方式各有优劣。如果页面比较少的,建议可以全部封装为页面对象;如果页面比较多,而且跳转复杂,建议使用两者结合的方式,一级页面,二级页面封装,三级以上页面,就不需要封装,使用控件对象完成页面操作。利用封装好的页面对象/控件对象,再进一步完成业务关键字封装,比如登录,注册,添加商品,支付等等操作,这样有个好处就是需求变动,业务流程调整,或者添加流程等,只需要封装新的流程,重组用例,维护工作量会减少很多。这样的三层结构非常清晰,第一层页面对象封装层只需要关注维护页面元素对象,第二层业务封装层只需要关注产品的业务流程拆分,第三层用例层只需要关注用例的流程组合以及测试数据,具体架构参考下图:
下面附上部分代码,有不对的地方请指正。
接口,定义基类页面的方法,可能不全,需要的可以继续补充
import org.openqa.selenium.WebElement; interface BasePage {
WebElement findElement(String loc); void sendKeys(String loc, String var1); void click(String loc); void submit(String loc); void switchToFrame(String loc); void switchToParentFrame(); void closeAlert(); void acceptAlert(); String getAlertText(); void moveToElement(String loc); void doubleClick(String loc); void contextClick(String loc); void dragAndDrop(String source, String target); void closeBrowser(); String getTitle(); String getUrl(); void maxBrowser();
}
基类实现的抽象类,其他的页面继承该类再个性化实现即可:
import com.uitest.control.by.LocationUtil;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions; import java.util.concurrent.TimeUnit; public abstract class BasePageImpl implements BasePage {
protected final WebDriver driver;
private static final long timeOutInSeconds = 10; BasePageImpl(WebDriver driver, String url) {
this.driver = driver;
this.driver.manage().timeouts().implicitlyWait(timeOutInSeconds, TimeUnit.SECONDS);
this.driver.get(url);
} BasePageImpl(WebDriver driver) {
this.driver = driver;
this.driver.manage().timeouts().implicitlyWait(timeOutInSeconds, TimeUnit.SECONDS);
} public WebElement findElement(String loc) {
return driver.findElement(LocationUtil.getLocation(loc));
} public void sendKeys(String loc, String var1) {
findElement(loc).sendKeys(var1);
} public void click(String loc) {
findElement(loc).click();
} public void submit(String loc) {
findElement(loc).submit();
} public void switchToFrame(String loc) {
driver.switchTo().frame(findElement(loc));
} public void switchToParentFrame() {
driver.switchTo().parentFrame();
} public void closeAlert() {
driver.switchTo().alert().dismiss();
} public void acceptAlert() {
driver.switchTo().alert().accept();
} public String getAlertText() {
return driver.switchTo().alert().getText();
} public void moveToElement(String loc) {
new Actions(driver).moveToElement(findElement(loc)).perform();
} public void doubleClick(String loc) {
new Actions(driver).doubleClick(findElement(loc)).perform();
} public void contextClick(String loc) {
new Actions(driver).contextClick(findElement(loc)).perform();
} public void dragAndDrop(String source, String target) {
new Actions(driver).dragAndDrop(findElement(source), findElement(target)).perform();
} public void closeBrowser() {
driver.close();
} public String getTitle() {
return driver.getTitle();
} public String getUrl() {
return driver.getCurrentUrl();
} public void maxBrowser() {
driver.manage().window().maximize();
}
}
工具类:
import org.openqa.selenium.By; import java.util.Arrays;
import java.util.List; public class LocationUtil {
/**
* 定位信息,比如id=kw
* @param var 格式xpath=//*[@id="kw"]
* @return org.openqa.selenium.By
*/
public static By getLocation (String var) {
List list = Arrays.asList(var.split("=", 2));
if (list.size() < 2 || "".equals(list.get(1))) {
return null;
}
String loc = String.valueOf(list.get(1));
switch (ByType.valueOf(list.get(0).toString().toUpperCase())) {
case ID:
return By.id(loc);
case NAME:
return By.name(loc);
case XPATH:
return By.xpath(loc);
case CSS:
return By.cssSelector(loc);
case TAG:
return By.tagName(loc);
case CLASS:
return By.className(loc);
case LINKTEXT:
return By.linkText(loc);
case PARTIALLINKTEXT:
return By.partialLinkText(loc);
default:
return null;
}
}
}
Java+selenium之WebDriver的常用方法封装(八)的更多相关文章
- 《手把手教你》系列技巧篇(二十三)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换下卷(详细教程)
1.简介 上一篇讲解和分享了如何获取浏览器窗口的句柄,那么今天这一篇就是讲解获取后我们要做什么,就是利用获取的句柄进行浏览器窗口的切换来分别定位不同页面中的元素进行操作. 2.为什么要切换窗口? Se ...
- Selenium的webdriver的常用方法,鼠标事件
就来认识 WebDriver 中最常用的几个方法: get():跳转到的地址clear(): 清除文本. send_keys (value): 模拟按键输入. click(): 单击元素. 示例: f ...
- Java+selenium之WebDriver对浏览器的简单操作(一)
操作浏览器的主要方法都来自 org.openqa.selenium.WebDriver 这个接口 这些方法都是在 org.openqa.selenium.remote.RemoteWebDriver这 ...
- 基于Java+Selenium的WebUI自动化测试框架(八)-----读取元素(XML文件)
我们继续回到自动化测试框架的主线上来,在前面的文章中,我们定义一个页面元素的主要参数有:路径,找寻方式,等待时间,名称,这个四个参数.另外,我们还需要考虑一个问题,就是网站的页面. 举个例子来说,如果 ...
- Java+selenium之WebDriver模拟鼠标键盘操作(六)
org.openqa.selenium.interactions.Actions类,主要定义了一些模拟用户的鼠标mouse,键盘keyboard操作.对于这些操作,使用 perform()方法进行执行 ...
- Java+selenium之WebDriver的cookie,等待等高级操作(五)
1. 操作cookie // 增加一个 name = "name",value="value" 的 cookie Cookie cookie = new Coo ...
- Java+selenium之WebDriver常见特殊情况如iframe/弹窗处理(四)
1. iframe 的处理 查找元素必须在对应的 ifarme 中查找,否则是找不到的 // 传入参数为 frame 的序号,从0开始 driver.switchTo().frame(Int inde ...
- Java+selenium之WebDriver的抛出异常分析(七)
NoSuchElementException 1.检查元素的定位器是否正确 2.如果定位器正确,增加休眠时间 3.等待了足够的时间依然找不到的话,更换定位器的定位方式 NoSuchWindowExce ...
- Java+selenium之WebDriver页面元素的操作(三)
1. 输入框(text field or textarea) WebElement we = driver.findElement(By.id("id")); //将输入框清空 w ...
随机推荐
- SFTP客户端代码示例
参考链接:SFTP客户端代码示例 操作系统:Windows7/8,VS2013 环境:libssh2 1.4.3.zlib-1.2.8.openssl-1.0.1g 原文: “从http://www. ...
- mysql for linux6.8单机版安装
主机名以及hostname文件修改 vi /etc/hosts vi /etc/sysconfig/network hostname mysql01 系统参数修改 设置用户资源限制 vi /etc/s ...
- P4553 80人环游世界
题目地址:P4553 80人环游世界 上下界网络流 无源汇上下界可行流 给定 \(n\) 个点, \(m\) 条边的网络,求一个可行解,使得边 \((u,v)\) 的流量介于 \([B(u,v),C( ...
- CF1098B/CF1099E Nice table
题目地址:CF1098B/CF1099E Nice table 显然,a nice table需要满足如下条件: 要么,每行都由两个字符交替组成,相邻两行的字符均不相同 要么,每列都由两个字符交替组成 ...
- matplotlib 直方图绘制详解
n, bins, patches = plt.hist(datasets, bins, normed=False, facecolor=None, alpha=None) 函数说明 用于绘制多个数据集 ...
- MongoDB 和 NoSQL简介
MongoDB 是一个基于分布式文件存储的数据库( https://www.mongodb.com/ ).由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案.MongoDB ...
- 卷积神经网络(matlab实现)
卷积神经网络是看matlab 的一个toolbox入的门: https://github.com/rasmusbergpalm/DeepLearnToolbox 还有一篇原理推导文献,全是公式: ht ...
- 使用python脚本批量删除阿里云oss中的mp4文件
#encoding:utf-8 ''' oss中有一些mp4文件需要删除,首先定位出这些文件放在txt文本中 然后通过python操作oss进行批量删除 ''' import oss2 auth = ...
- 数据库中关于convert的参数学习(转化函数用法)
该页面中的内容来之http://www.cnblogs.com/xionglee/articles/1444916.html,以前我一直不知道当中的1,2,3表示什么,现在才知道呀!style 格式: ...
- Record && Limit
案例一:Record 预期效果:在 IVR 与用户交互的时候,比如让用户读一段语音,当用户读完之后,按键结束录音. <action application="set" dat ...