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 = [ [ ...
随机推荐
- Coursera SDN M1.2.1 SDN History: Programmable Networks 2
NOTE Capsules Example 1.Type Field: excute forwarding routine => carry program 2.Previous address ...
- UVa 1635 无关的元素(唯一分解定理+二项式定理)
https://vjudge.net/problem/UVA-1635 题意: 给定n个数a1,a2,...an,依次求出相邻两数之和,将得到一个新数列.重复上述操作,最后结果将变成一个数.问这个数除 ...
- mongodb的安装与增删改查
mongodb是一款分布式的文件存储的数据库,注意这两个词,分布式和文件存储.mongodb支持复制和分片,可以合理的运用空间的大小,也可以达到容灾的目的.另外文件存储也是一个特点,抛弃了传统的表的概 ...
- 中国铁路基于Intel架构超大规模OpenStack行业云的性能优化研究
1. 项目简介 铁路作为一种大众化的交通工具和非常重要的货物运输方式,其业务规模庞大.覆盖全国.服务全国各族人民.铁路面向公众提供的服务业务,主要是客运和货运两大类,且每年365天.每天7*24小时连 ...
- RabbitMQ入门_01_简介与安装
A. 资源与参考文档 官网:https://www.rabbitmq.com/ B. 学习目的 部门目前使用其他部门维护的 WebLogic 的 JMS 消息服务,缺乏足够的技术支持与运维支持.随着基 ...
- 6-9 😢 5小时的debug: 从rails 命令运行超慢开始->删除rails->删除ruby->删除rvm->安装上rvm->安装上ruby
上午,莫名其妙的rails app不能用了,rails -v一查发现不存在.ruby -v发现是2.0的版本.很着急上火,因为很少使用过rvm这个ruby版本控制器.所以照官网文档.从新安装ruby, ...
- angularJs---route
route route---‘路由’ ajax的弊端: 1.ajax请求不会留下history记录 2.用户无法直接通过url进入应用中的指定页面(保存书签,分享朋友?) 3.ajax不利于SEO 前 ...
- C语言中的可变参数函数
C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一个参数format固定以外 ...
- Window 7 平台的IE11浏览器预览版发布
继之前Windows 8.1 带来了IE11浏览器之后,今天Window 7 以及Windows Server 2008 R2平台的IE11浏览器预览版也已经发布. 当然这还只是一个开发者预览版,可能 ...
- Java中private、protected、public和default的区别 (转)
本文内容转载自: https://www.cnblogs.com/jingmengxintang/p/5898900.html public: 具有最大的访问权限,可以访问任何一个在classpath ...