UI“三重天”之selenium--封装(二)
基础示例代码:
/**
* @author Richered
**/
package com.sample; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver; public class TestBaidu {
public static WebDriver driver = null; public static void main(String[] args) throws InterruptedException{
System.setProperty("webdriver.chrome.driver", "tools/chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.baidu.com");
Thread.sleep(2000);
driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("桃李不言、下自成蹊 博客园");
Thread.sleep(5000);
// driver.findElement(By.xpath("//*[@id=\"su\"]")).click();
driver.close();
}
}
本例基本上和官方示例代码一般无二,首先是获取浏览器driver,打开浏览器,将浏览器最大化,进入baidu,等待2s,找到百度输入框并传值"桃李不言、下自成蹊 博客园",等待5s,关闭浏览器。
代码都是被写死的,例如这块不想使用google浏览器,想使用firefox浏览器或者IE浏览器呢?不想将浏览器窗口最大化呢?想进入www.bing.com呢?不想使用xpath的定位方式呢?
问题抛出来了,这样写代码的方式也着实僵硬,那么如何解决呢?--封装关键字、动作
封装
封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是
将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。(copy百度百科)
其实讲的通俗一点就是:封装提高了代码的重用性,不用关心具体的实现,当然,封装也是面向对象的三大特征之一。
看看封装上方的代码是如何实现:
/**
* @author Richered
**/
package com.sample; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver; public class KeyWord {
public WebDriver driver;
public KeyWord() { }
//选择浏览器
public void openBrowser(String browserType) {
try {
switch (browserType) {
case "chrome":
GoogleDriver chrome = new GoogleDriver("tools/chromedriver.exe");
driver = chrome.getdriver();
break;
case "ff":
FFDriver firefox = new FFDriver("F:\\Firefox\\firefox.exe", "tools/geckodriver.exe");
driver = firefox.getdriver();
break;
default:
GoogleDriver c = new GoogleDriver("tools/chromedriver.exe");
driver = c.getdriver();
break;
}
} catch (Exception e) {
// TODO: handle exception
}
} //关闭浏览器
public void closeBrowser() {
try {
driver.quit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("关闭浏览器出错!");
}
}
//浏览器大小显示
public void setWindow(){
driver.manage().window().maximize();
} //访问网站
public void getURL(String url) {
try {
driver.get(url);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//封装name定位元素并传值
public void inputByNameAndSubmit(String name,String content) {
try {
driver.findElement(By.name(name)).sendKeys(content);
driver.findElement(By.name(name)).submit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//封装id定位元素并传值
public void inputById(String id, String content) {
try {
driver.findElement(By.id(id)).sendKeys(content);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//用xpath定位元素并传值
public void inputByxpath(String xpath, String content) {
try {
driver.findElement(By.xpath(xpath)).sendKeys(content);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/***********************************************************/
//用id定位元素并点击
public void clickByid(String id) {
try {
driver.findElement(By.id(id)).click();
} catch (Exception e) {
// TODO: handle exception
}
}
//用name定位元素并点击
public void clickByname(String name) {
try {
driver.findElement(By.name(name)).click();
} catch (Exception e) {
// TODO: handle exception
}
}
//用xpath定位元素并点击
public void clickByxpath(String xpath) {
try {
driver.findElement(By.xpath(xpath)).click();
} catch (Exception e) {
// TODO: handle exception
}
}
/***********************************************************/
//选择点击方法
public void clickSwitch(String method, String phase) {
try {
switch (method) {
case "id":
driver.findElement(By.id(phase)).click();
break;
case "classname":
driver.findElement(By.className(phase)).click();
break;
case "name":
driver.findElement(By.name(phase)).click();
break;
case "tagname":
driver.findElement(By.tagName(phase)).click();
break;
case "linktext":
driver.findElement(By.linkText(phase)).click();
break;
case "partialLinktext":
driver.findElement(By.partialLinkText(phase)).click();
break;
case "xpath":
driver.findElement(By.xpath(phase)).click();
break;
case "css":
driver.findElement(By.cssSelector(phase)).click();
break;
default:
driver.findElement(By.xpath(phase)).click();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//封装强制等待
public void halt(String time) {
int t = 1000;
try {
t = Integer.parseInt(time);
Thread.sleep(t);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注释里边写的很清楚了,此处封装了选择浏览器,关闭浏览器,访问URL,name、id、xpath的定位元素(传值)方式【当然可以增加其他的定位方式,下同】,name、id、xpath的定位元素并点击,选择点击方法,等待。
同样是上方示例代码的目的,再看实现方式:
/**
* @author Richered
**/
package com.sample; public class TestBaidu {
public static void main(String[] args) { KeyWord sm = new KeyWord();
sm.openBrowser("chrome");
sm.setWindow();
sm.getURL("https://www.baidu.com");
sm.halt("2000");
sm.inputByxpath("//*[@id=\"kw\"]", "桃李不言、下自成蹊 博客园");
sm.halt("5000");
sm.closeBrowser();
}
}
嗯哼,是不是代码量简洁了许多呢?选择哪个浏览器可以灵活选择;定位元素的方式被单独伶了出来,传值即可;动作也被伶了出来,当然等待方式等等关键字、动作都可以进行封装。
后续~~~~~
UI“三重天”之selenium--封装(二)的更多相关文章
- UI“三重天”之Selenium(一)
关注一下UI自动化,记一记笔记. UI自动化的优缺点: 关于UI自动化的优缺点想来大家都有了解,优点:解放人力(并不是完全解放),用机器(涵盖工具.脚本等)代替人工完成测试工作,将测试用例转化为脚本实 ...
- python+selenium封装UI自动化框架
seleinum框架 框架的思想: 解决我们测试过程中的问题:大量的重复步骤,用自动化来实现 1)配置和程序的分离 2)测试数据和程序的分离 3)不懂编程的人员可以方便使用:使用的 ...
- python+selenium十:基于原生selenium的二次封装
from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium ...
- python+selenium十:selenium的二次封装
python+selenium十:基于原生selenium的二次封装 from selenium import webdriverfrom selenium.webdriver.support.w ...
- iOS开发UI篇—核心动画(UIView封装动画)
iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画 ...
- selenium 封装
周末无聊 在家封装一个pyselenium.可能这些封装大家都会使用,但是我还是根据我自己的习惯去选择性的去封装一些在我工作中用的,这样的话,我就不用去看selenium的api的,我可以根据我自己的 ...
- 任务四十一:UI组件之日历组件(二)
任务四十一:UI组件之日历组件(二) 面向人群: 有一定基础的同学 难度: 中 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容的质量以及学 ...
- 深入理解基于selenium的二次开发
对于做web端自动化测试的人来说,可能接触selenium比QTP还要多,但是我们在做基于selenium的二次开发的时候,经常会说到二次开发是为了易于维护,很多人可能不懂得维护的价值是什么,和到底要 ...
- AngularJs的UI组件ui-Bootstrap分享(十二)——Rating
Rating是一个用于打分或排名的控件.看一个最简单的例子: <!DOCTYPE html> <html ng-app="ui.bootstrap.demo" x ...
- 三重for循环实现对二维数组的按列排序(JavaScript)
由C语言联想到的:三重for循环实现对二维数组的按列排序,并且牵扯到数据结构. 自己写的,水平有限,本文属于原创,可能存在错误,忘指正~ function circle() { var a = [ [ ...
随机推荐
- java学习之浅谈多线程4--SwingWorker
GUI事件处理和绘图代码在一个被称为事件分发线程的特殊线程中执行.如果一个事件需要很长的时间处理,线程就不能顾及到队列中的其他任务.为了解决这个问题,可以运行费时的任务来处理单独线程中的事件.Swin ...
- Codeforces Round #169 (Div. 2) E. Little Girl and Problem on Trees dfs序+线段树
E. Little Girl and Problem on Trees time limit per test 2 seconds memory limit per test 256 megabyte ...
- Andrew and Taxi CodeForces - 1100E (思维,拓扑)
大意: 给定有向图, 每条边有一个权值, 假设你有$x$个控制器, 那么可以将所有权值不超过$x$的边翻转, 求最少的控制器数, 使得翻转后图无环 先二分转为判定问题. 每次check删除能动的边, ...
- CentOS下安装Python-pip
1.安装epel-release软件包:自动配置yum的软件仓库,弥补centos内容更新有时比较滞后或是一些扩展的源没有. yum -y install epel-release 2.安装pytho ...
- 【Demo】CSS3元素旋转、缩放、移动或倾斜
CSS3元素旋转.缩放.移动或倾斜 代码: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- python运行错误---TabError: Inconsistent use of tabs and spaces in indentation
本文转载于:http://blog.csdn.net/sinat_36384705/article/details/71155379 首先这个错误的意思是:在缩进的时候,使用了错误的空格和tab 我使 ...
- linux 网络测试命令 长期更新
一.网络测试命令 1.测试 网络连接 发送两包后停发 [oracle@hadoop ~]$ PING www.a.shifen.com (() bytes of data. bytes from tt ...
- TR-069: ACS Discovery
ACS Discovery 原文链接:http://www.qacafe.com/knowledgebase/tr-069-training-series-acs-discovery/ In TR-0 ...
- input type="file"在各个浏览器下的默认样式,以及修改自定义样式
一.<input type="file"/>在各个浏览器中的默认样式: 系统 浏览器 样式效果 点击效果 mac google 点击按钮和输入框都可以打开文件夹 mac ...
- L180
The cylinder is a crucial part of the washing machine His debonair dismissal of my inquiry concernin ...