总结: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的常用方法封装(八)的更多相关文章

  1. 《手把手教你》系列技巧篇(二十三)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换下卷(详细教程)

    1.简介 上一篇讲解和分享了如何获取浏览器窗口的句柄,那么今天这一篇就是讲解获取后我们要做什么,就是利用获取的句柄进行浏览器窗口的切换来分别定位不同页面中的元素进行操作. 2.为什么要切换窗口? Se ...

  2. Selenium的webdriver的常用方法,鼠标事件

    就来认识 WebDriver 中最常用的几个方法: get():跳转到的地址clear(): 清除文本. send_keys (value): 模拟按键输入. click(): 单击元素. 示例: f ...

  3. Java+selenium之WebDriver对浏览器的简单操作(一)

    操作浏览器的主要方法都来自 org.openqa.selenium.WebDriver 这个接口 这些方法都是在 org.openqa.selenium.remote.RemoteWebDriver这 ...

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

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

  5. Java+selenium之WebDriver模拟鼠标键盘操作(六)

    org.openqa.selenium.interactions.Actions类,主要定义了一些模拟用户的鼠标mouse,键盘keyboard操作.对于这些操作,使用 perform()方法进行执行 ...

  6. Java+selenium之WebDriver的cookie,等待等高级操作(五)

    1. 操作cookie // 增加一个 name = "name",value="value" 的 cookie Cookie cookie = new Coo ...

  7. Java+selenium之WebDriver常见特殊情况如iframe/弹窗处理(四)

    1. iframe 的处理 查找元素必须在对应的 ifarme 中查找,否则是找不到的 // 传入参数为 frame 的序号,从0开始 driver.switchTo().frame(Int inde ...

  8. Java+selenium之WebDriver的抛出异常分析(七)

    NoSuchElementException 1.检查元素的定位器是否正确 2.如果定位器正确,增加休眠时间 3.等待了足够的时间依然找不到的话,更换定位器的定位方式 NoSuchWindowExce ...

  9. Java+selenium之WebDriver页面元素的操作(三)

    1. 输入框(text field or textarea) WebElement we = driver.findElement(By.id("id")); //将输入框清空 w ...

随机推荐

  1. 使用jQuery重置(reset)表单的方法

    由于JQuery中,提交表单是像下面这样的: 代码如下: $('#yigeform').submit() 所以,想当然的认为,重置表单,当然就是像下面这样子喽: 代码如下: $('#yigeform' ...

  2. AbstractQueuedSynchronizer的简单介绍

    AbstractQueuedSynchronizer简称为AQS.大多数开发者不会直接使用AQS,标准同步器类的集合能够满足绝大多数情况的需求. 1.AbstractQueuedSynchronize ...

  3. 【SVN】CentOS7.0下搭建SVN服务器

    SVN服务器搭建 最近接手了天赋吉运的SVN项目管理,那么学会搭建SVN服务器就成为了必须的技能.这篇文章就来讲一讲在CentOS7.0下如何搭建SVN服务器 1,下载安装SVN版本 yum inst ...

  4. Samples topic

    Rendering: http://www.cnblogs.com/miloyip/archive/2010/03/29/1698953.html http://www.scratchapixel.c ...

  5. 【ARTS】01_20_左耳听风-20190325~20190331

    zz## ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 ...

  6. MySQL中interactive_timeout和wait_timeout的区别【转】

    在用mysql客户端对数据库进行操作时,打开终端窗口,如果一段时间没有操作,再次操作时,常常会报如下错误: ERROR 2013 (HY000): Lost connection to MySQL s ...

  7. 节流(Throttling)和去抖(Debouncing)详解

    这篇文章的作者是 David Corbacho,伦敦的一名前端开发工程师.之前我们有一篇关于”节流”和”去抖”的文章:The Difference Between Throttling and Deb ...

  8. 036_lua应用扩展

    一.request_id定义 ## # request id ## lua_package_path '/opt/nginx/conf/lua/lib/?.lua'; init_by_lua ' uu ...

  9. CF 189A Cut Ribbon

    #include<bits/stdc++.h> using namespace std; const int maxn = 4000 + 131; int n, a, b, c; int ...

  10. POJ 1006 同余方程组

    以前的做法 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring& ...