selenium 封装代码
package pers.xeon.automate.auxt; import org.openqa.selenium.By;
import org.openqa.selenium.WebElement; /**
* @author xeon
* @version 创建时间:2016年3月25日 上午10:11:07
* 高级操作接口
*/
public interface AdvanceHandle { // 窗口最大化
public void maximize(); /*
* 这个方法是用于切换为原来的窗口,但是前提是一定有弹框出现,并且使用过切换窗口方法
*/
public void changeLastWindow(); /*
* 当弹框出现的时候,调用就会切换到对应的窗口
*/
public void changeWindow(); /*
* 刷新页面之后继续,等待元素
*/
public boolean waitElementByRefresh(By locator, int time, int k); /*
* 刷新页面等待元素 不用指定时间,系统指定固定时间 方法重载 默认刷新页面2次,等待5秒
*/
public boolean waitElementByRefresh(By locator); /*
* 最好不用这个方法,但是我还是提供给你 这个方法是处理等待元素方法1
*/
public boolean waitElementByWait(By locator, int time, boolean b); /*
* 等待无限时间 不建议使用,如果一直没有加载出来,线程就阻塞
*/
public boolean waitElementByWait(By locator); /*
* 等待指定时间 建议使用,我自己写的方法 方法与显性等待是一样的
*/
public boolean waitElementByWait(By locator, int time); /*
* 判断元素是否存在
*/
public boolean isElementExsit(By locator); /*
* 这个方法是处理元素加载方法2 显性等待指定时间
*/
public WebElement waitElement(By by, int time); /*
* 默认等10秒 10秒我比较喜欢所以搞一个单独方法,少写一个条件而已 显性等待10秒之内加载,比较好用,建议使用
*/
public WebElement waitElement(By by); /*
* 这个方法是处理元素加载的方法3
*/
public void waitElementByThread(int ms); /*
* 这个方法是处理元素加载的方法4 建议不要使用这个,这个是隐形等待,当改变这个时候可能会影响其他元素等待 说白了是全局,注意不要使用
*/
public void waitElementByInvisible(int second); /*
* 下拉框操作选择字符串为str 按照值定位 这个需要找到下拉框的value值定位
*/
public void selectValue(String estr, String str); /*
* 下拉框操作选择字符串为str 可见文本定位 建议用这个
*/
public void select(String estr, String str); /*
* 索引定位 下拉框操作选择字符串Index为index
*/
public void select(String estr, int index); /*
* 弹框点击确定
*/
public void alertAccept(); /*
* 弹框点击确定
*/
public void alertDismiss(); /*
* 得到弹框文本
*/
public void alertGetText(); /*
* Frame切换
*/
public void frame(String FrameName); /*
* 上传文件,上传图片等 方法可能无效,Driver自带的
*/
public void UploadBySendKeys(String estr, String strPath); /*
* 上传文件,上传图片 建议使用这个,100%没得问题 我利用复制粘贴,然后你懂得
* 这里面的strPath,我使用的相对路径,相对项目的根路径写的(好处就是可以到处移动,他的参考点事这个项目的根路径)
*/
public void upload(String estr, String strPath); }
AdvanceHandle接口类
package pers.xeon.automate.auxt; import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.TimeUnit; import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait; /**
* @version 创建时间:2016年2月19日 下午2:12:26
* 处理页面的高级操作
* 总有适合自己的默认方法,下面等待时间我设置默认方法.为了满足开闭原则,我那天也懒得改,还有很多比默认方法强大同类型方法
*/
public class DefaultAdvancedHandle implements AdvanceHandle { private Driver driver ;
private static String preWindowString;
private static String imagePath=(new File("").getAbsolutePath()).toString(); public DefaultAdvancedHandle(Driver driver) {
this.driver = driver;
} /*
* 这个方法是用于切换为原来的窗口,但是前提是一定有弹框出现,并且使用过切换窗口方法
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#changeLastWindow()
*/
@Override
public void changeLastWindow() {
driver.switchTo().window(preWindowString);
} /*
* 当弹框出现的时候,调用就会切换到对应的窗口
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#changeWindow()
*/
@Override
public void changeWindow() {// 这个方法是处理跳出页面
preWindowString = driver.getWindowHandle();
Set<String> handles = driver.getWindowHandles();
Iterator<String> it = handles.iterator();
String cruWindowString;
while (it.hasNext()) {
cruWindowString = it.next();
if (preWindowString == cruWindowString) {
continue;
}
driver.switchTo().window(cruWindowString);
}
} /*
* 刷新页面之后继续,等待元素
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#waitElementByRefresh(org.openqa.selenium.By, int, int)
*/
@Override
public boolean waitElementByRefresh(By locator,int time,int k){
int i = 0;
while(waitElementByWait(locator,time)){
driver.navigate().refresh();
i++;
if(i == k){
return false;
}
}
return true;
} /*
* 刷新页面等待元素
* 不用指定时间,系统指定固定时间
* 方法重载
* 默认刷新页面2次,等待5秒
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#waitElementByRefresh(org.openqa.selenium.By)
*/
@Override
public boolean waitElementByRefresh(By locator){
return waitElementByRefresh(locator,5,2);
} /*
* 最好不用这个方法,但是我还是提供给你
* 这个方法是处理等待元素方法1
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#waitElementByWait(org.openqa.selenium.By, int, boolean)
*/
@Override
public boolean waitElementByWait(By locator,int time,boolean b){ long start = System.currentTimeMillis(); while(!isElementExsit(locator)){
if(b){
if(System.currentTimeMillis() >= (start +time*1000)){
break;
}
}
}
return isElementExsit(locator);
} /*
* 等待无限时间
* 不建议使用,如果一直没有加载出来,线程就阻塞
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#waitElementByWait(org.openqa.selenium.By)
*/
@Override
public boolean waitElementByWait(By locator){
return waitElementByWait(locator,0,false);
} /*
* 等待指定时间
* 建议使用,我自己写的方法
* 方法与显性等待是一样的
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#waitElementByWait(org.openqa.selenium.By, int)
*/
@Override
public boolean waitElementByWait(By locator,int time){
return waitElementByWait(locator,time,true);
} /*
* 判断元素是否存在
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#isElementExsit(org.openqa.selenium.By)
*/
@Override
public boolean isElementExsit(By locator) {
boolean flag = false;
try {
WebElement element=driver.findElement(locator);
flag= null != element;
} catch (NoSuchElementException e) {
return flag;
}
return flag;
} /*
* 这个方法是处理元素加载方法2
* 显性等待指定时间
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#waitElement(org.openqa.selenium.By, int)
*/
@Override
public WebElement waitElement(By by,int time){
WebDriverWait wait = new WebDriverWait(driver,time);
wait.until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(by);
}});
return null;
} /*
* 默认等10秒
* 10秒我比较喜欢所以搞一个单独方法,少写一个条件而已
* 显性等待10秒之内加载,比较好用,建议使用
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#waitElement(org.openqa.selenium.By)
*/
@Override
public WebElement waitElement(By by){
return waitElement(by,10);
} /*
* 这个方法是处理元素加载的方法3
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#waitElementByThread(int)
*/
@Override
public void waitElementByThread(int ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
System.out.println("Thread睡眠被唤醒,这本来是个异常,我已经手动处理:原因是因为我估计这个线程被其他线程唤醒,开始执行,所以并没有抛出异常,直接处理");
}
} /*
* 这个方法是处理元素加载的方法4
* 建议不要使用这个,这个是隐形等待,当改变这个时候可能会影响其他元素等待
* 说白了是全局,注意不要使用
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#waitElementByInvisible(int)
*/
@Override
public void waitElementByInvisible(int second) {
driver.manage().timeouts().implicitlyWait(second, TimeUnit.SECONDS);
} /*
* 下拉框操作选择字符串为str
* 按照值定位
* 这个需要找到下拉框的value值定位
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#selectValue(java.lang.String, java.lang.String)
*/
@Override
public void selectValue(String estr,String str){
Select select = new Select(driver.findElement(estr));
select.selectByValue(str);
} /*
* 下拉框操作选择字符串为str
* 可见文本定位
* 建议用这个
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#select(java.lang.String, java.lang.String)
*/
@Override
public void select(String estr,String str){
Select select = new Select(driver.findElement(estr));
select.selectByVisibleText(str);
} /*
* 索引定位
* 下拉框操作选择字符串Index为index
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#select(java.lang.String, int)
*/
@Override
public void select(String estr,int index){
Select select = new Select(driver.findElement(estr));
select.selectByIndex(index);
} /*
* 最大化窗口
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#maximize()
*/
@Override
public void maximize() {
driver.manage().window().maximize();
} /*
* 弹框点击确定
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#alertAccept()
*/
@Override
public void alertAccept(){
Alert alert = driver.switchTo().alert();
alert.accept();
} /*
* 弹框点击确定
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#alertDismiss()
*/
@Override
public void alertDismiss(){
Alert alert = driver.switchTo().alert();
alert.dismiss();
} /*
* 得到弹框文本
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#alertGetText()
*/
@Override
public void alertGetText(){
Alert alert = driver.switchTo().alert();
alert.getText();
} /*
* 上传文件,上传图片等
* 方法可能无效,Driver自带的
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#UploadBySendKeys(java.lang.String, java.lang.String)
*/
@Override
public void UploadBySendKeys(String estr,String strPath){
WebElement adFileUpload =driver.findElement(estr);
strPath=imagePath+"\\"+strPath;
adFileUpload.sendKeys(strPath);
} /*
* 上传文件,上传图片
* 建议使用这个,100%没得问题
* 我利用复制粘贴,然后你懂得
* 这里面的strPath,我使用的相对路径,相对项目的根路径写的(好处就是可以到处移动,他的参考点事这个项目的根路径)
*/
/* (non-Javadoc)
* @see pers.xeon.automate.auxt.AdvanceHandle#upload(java.lang.String, java.lang.String)
*/
@Override
public void upload(String estr,String strPath){
driver.click(estr);
try {
upload(strPath);
} catch (AWTException e) {
System.out.println("AWTException:由于Robot类初始化失败");
} catch (InterruptedException e) {
System.out.println("InterruptedException:可能导致上传失败,线程被唤醒");
} } /*
* 得到系统剪贴板
*/
private void copy(String text) {
//拿到当前系统剪切板,首先拿到工具箱,然后得到系统剪切板
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
//选中文本
StringSelection selection = new StringSelection(text);
//搞到剪切板里面去
clipboard.setContents(selection, null);
} /*
* 这个方法是复制指定字符串的文本到剪切板 调用keyPressWithCtrl实现ctrl + v,然后enter操作
*/
private void keyPressString(Robot r, String str) throws InterruptedException {
copy(str);
keyPressWithCtrl(r);// 粘贴
} /*
* 实现ctrl + v,然后enter操作
*/
private void keyPressWithCtrl(Robot r) throws InterruptedException {
r.keyPress(KeyEvent.VK_CONTROL);
r.keyPress(KeyEvent.VK_V);
r.keyRelease(KeyEvent.VK_V);
r.keyRelease(KeyEvent.VK_CONTROL);
Thread.sleep(1000);
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);
} /*
* 对付上传按钮方法
*/
private void upload(String image) throws AWTException, InterruptedException {
Robot robot = new Robot();
keyPressString(robot, image);
} @Override
public void frame(String FrameName) {
driver.switchTo().frame(FrameName);
}
}
AdvanceHandle接口的实现类DefaultAdvancedHandle
selenium 封装代码的更多相关文章
- 【Selenium05篇】python+selenium实现Web自动化:读取ini配置文件,元素封装,代码封装,异常处理,兼容多浏览器执行
一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第五篇博 ...
- 七、Block 封装代码
1.概念:封装代码块,调用的时候使用 2.声明 返回类型(^名字)(参数1,参数2..) = (参数类型 变量1,参数类型, 变量2){ }; int (^Sum)(int,int) = ^(int ...
- [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码
函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...
- python解析xml模块封装代码
在python中解析xml文件的模块用法,以及对模块封装的方法.原文转自:http://www.jbxue.com/article/16586.html 有如下的xml文件:<?xml vers ...
- python网页请求urllib2模块简单封装代码
这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...
- <<海闻电子发票接口 ESB 封装 代码指示 文档>>
<<海闻电子发票接口 ESB 封装 代码指示 文档>> isValid 是否有效标志 代码 中文 说明 true 成功 false 失败 code 海闻错误说明 代码 中文 ...
- Ajax--json(Ajax调用返回json封装代码、格式及注意事项)
Ajax调用json封装代码<dbda.php>: //Ajax调用返回JSON public function JsonQuery($sql,$type=1,$db="mydb ...
- jdbc封装代码
jdbc封装代码 package jdbcUtil; import java.sql.Connection; import java.sql.DriverManager; import java.sq ...
- Uiautomator ---(1) 封装代码
http://www.cnblogs.com/by-dream/p/4996000.html 上面是别人的写法 我自己的写法: package qq.test; import android.con ...
随机推荐
- C语言的概述--学习c的第二天
以下是整理的知识点: #include <stdio.h>/* 引入stdio.h文件c的标准函数库 */ int main(void)/* 定义一个函数main(),int定义函数返回的 ...
- DNS CNAME的一些细节
1, 概述 DNS中的CNAME可以减轻运维压力,使得已有的DNS配置具有一定的灵活性和可扩展性.本文对CNAME中的一些细节做阐述, 使DNS服务器的运维人员和开发人员能合理地使用CNAME. 2, ...
- ElasticSearch作为Windows服务启动
由于公司服务器用的Windows服务器,所以你懂得…… 直接下载elasticsearch中文发行版.下载地址是:https://github.com/medcl/elasticsear ...
- NOI 1.5 44:第n小的质数
---恢复内容开始--- 描述 输入一个正整数n,求第n小的质数. 输入 一个不超过10000的正整数n. 输出 第n小的质数. 样例输入 10 样例输出 29 方法1:合数一定可以表示成一个比它小的 ...
- HDU 5055 Bob and math problem(简单贪心)
http://acm.hdu.edu.cn/showproblem.php?pid=5055 题目大意: 给你N位数,每位数是0~9之间.你把这N位数构成一个整数. 要求: 1.必须是奇数 2.整数的 ...
- sychronized 和 Lock的比较
sychronized是在jvm层面上实现的,可以通过一些监控工具监控sychronized的锁定,而且在代码执行出现异常时,jvm会自动释放锁,但是使用Lock就不行,lock是通过代码实现的,最终 ...
- Struts2下载文件点取消出现的异常解决
struts2点击下载,如果正常下载不会报错,可是如果点击取消就会报如下的错误: Java.lang.IllegalStateException: Cannot call sendError() af ...
- HTML5--拖动01
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Mybatis传多个参数(三种解决方案)
http://blog.csdn.net/liangyihuai/article/details/49965869 (zhuan)
- Coursera台大机器学习课程笔记5 -- Theory of Generalization
本章思路: 根据之前的总结,如果M很大,那么无论假设泛化能力差的概率多小,都无法忽略,所以问题转化为证明M不大,然后上章将其转化为证明成长函数:mh(N)为多项式级别.直接证明似乎很困难,本章继续利用 ...