总结: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. 在Apache Struts中利用OGNL注入

    前言 本文简要介绍了Apache Struts的OGNL注入缺陷,文章中介绍使用简单的应用程序复现OGNL注入.深入研究针对公共漏洞,并理解这类漏洞. 内容 安装Apache Tomcat服务器(入门 ...

  2. Delphi XE-Windows下配置开发环境 (Android版/IOS)

    Delphi XE-Windows下配置开发环境  (Android版/IOS)   http://www.52jike.com/thread-1-1-1.html Delphi XE5的Androi ...

  3. pt-table-sync同步报错Called not_in_left in state 0 at /usr/bin/pt-table-sync line 5231【原创】

    试验环境MySQL5.7.19,自己使用pt-table-sync 3.0.2版本同步后,手动在从库执行后,在用pt-table-sync验证时报错 命令如下: pt-table-,u=用户名,p=, ...

  4. 游记-NOIP2018

    Day -3 受蛊惑跑到理工大去试机,意外发现home里的noilinux账户下有个压缩包,而且还试对了密码,怀着 激动 紧张的心情,打开来看,里面写着 (写出来我就会被禁赛了): asdfasdra ...

  5. linux系统快捷键

    tab 补全命令    两次tab    列出所有以字符前缀开头的命令 ctrl A    把光标移到命令行开头 ctrl E    把光标移到命令行结尾 ctrl C    强制终止当前的命令 ct ...

  6. Mac下更改JDK环境变量配置

    1.打开终端 2.如果你是第一次配置环境变量,可以使用“touch .bash_profile” 创建一个.bash_profile的隐藏配置文件(如果你是为编辑已存在的配置文件,则使用"o ...

  7. c中perror函数

    写代码这么久,竟然很少用到perror函数,忘记了其强大的功能. 所在头文件: #include<stdio.h> 函数定义: void perror(const char *str); ...

  8. Fiddler模拟低速网络

    1. 打开 Rules -> Customize Rules,ctrl + F 找 300 2.修改上传.下载速度,保存 ctrl + s 3.启动模拟网络限速 4.想要取消模拟网络限速,取消勾 ...

  9. Java二维码生成与解码

      基于google zxing 的Java二维码生成与解码   一.添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包) <!-- google二维码工具 --> &l ...

  10. 最新手机号码验证正则表达式(PHP版本)

    1 前言 手机号码是否合规,则需要校验,可以使用正则表达式. 2 代码 function checkPhoneNumberValidate($phone_number){ //@2017-11-25 ...