自动化脚本——java
自动化脚本
本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下selenium简单线性脚本的编写,并提供全部代码。
文中将看到,使用selenium编写一个能操作浏览器的脚本是非常容易的。而简单线性脚本的编写是下一步编写页面对象脚本的基础。
1.在开始之前,我想明确一下,自动化测试的基本原理。
有的测试人员认为自动化测试很神秘,很神奇。恰恰相反, 自动化测试很简单 。
自动化测试,一般分三个步骤:
1)取预期结果;
2)取实际结果;
3)断言:比较1)和2)来判断测试是否通过;
从历史角度来看,自动化测试的出现早于专职测试人员的出现。也就是说在开始有我们这些专门做软件测试的测试人员之前,自动化测试已经存在了。
原因就是他 简单 。
selenium自动化测试,在自动化测试里也是属于超级 简单 的一类。但前提是必须理解上面说的自动化测试原理,以及其他一些自动化测试设计原则。否则,我们将会看到, 简单的项目也会失败 。有很多由初、中级开发人员或会一点点代码的测试人员编写的selenium自动化测试项目,因此失败。
2.简单的selenium测试脚本编写,一般也是分三个步骤:
1)定位一个元素
2)操作一个元素
3)断言
好,这里用百度首页的搜索做一个例子:
‘’'java
1 package simplewebtest.test;
2
3 import java.util.concurrent.TimeUnit;
4
5 import org.openqa.selenium.By;
6 import org.openqa.selenium.WebDriver;
7 import org.openqa.selenium.firefox.FirefoxDriver;
8 import org.testng.annotations.Test;
9
10 public class TestBaiduHome {
11
12 @Test
13 public void searchSomething(){
14
15 WebDriver driver=new FirefoxDriver();//打开Firefox; open firefox
16 driver.get(“http://www.baidu.com”);//打开百度open the url
17 driver.findElement(By.id(“kw1”)).sendKeys(“GitHub”);//输入搜索关键字“GitHub";input search keyword
18 driver.findElement(By.id(“su1”)).click();//点击搜索按钮click the search button
19 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//等页面加载,10秒内不加载成功即报超时。waiting for 10 seconds
20 String aResult=driver.findElement(By.xpath(".//[@id=‘4’]/h3/a")).getText();//取第四条搜索结果的标题。 get the text of 4th search result
21 assert aResult.contains(“GitHub”);//做断言 assertion
22 driver.findElement(By.xpath(".//[@id=‘4’]/h3/a")).click();//打开第四个搜索结果。Open the 4th search result on baidu
23 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//等页面加载,10秒内不加载成功即报超时。waiting for 10 seconds
24
25 //获取所有窗口的handle,然后逐个切换,直到切换到最新窗口 switch to the new window
26 for(String winHandle : driver.getWindowHandles()){
27 driver.switchTo().window(winHandle);
28 }
29
30 String aTitle=driver.getTitle();//取新窗口的title
31 System.out.println(“current widnow title is:”+aTitle);//打出来看看
32 assert aTitle.contains(“GitHub”);//断言
33
34 }
35 }
‘’’
View Code
本系列所有代码https://github.com/zhangting85/simpleWebtest,
这个例子存放在src/test/java/simplewebtest/test/TestBaiduHome.java
下面逐行解释:
WebDriver driver=new FirefoxDriver();
这里是声明了一个 WebDriver 类型的对象引用,我给他起名叫driver;
然后让这个driver指向WebDriver的一个子类(FirefoxDriver)的对象;
我们知道FirefoxDriver继承自WebDriver,IEDriver也继承自WebDriver;
就像苹果继承自水果,橘子也继承自水果;
这里用了Java的向上转型,使用子类的对象来初始化父类的引用。(注:实际上Webdriver是一个接口。)
这将产生什么效果呢?
我们在driver上调用方法的时候,都是先查找WebDriver里的方法定义,然后jvm去他的子类比如FirfoxDriver中找到其在子类中的实现,再执行的。比如FirefoxDriver的get方法和IEDriver的get方法,他们具体执行的代码内容明显是不一样的。但我们的脚本,只要改变driver引用的子类,而不用改变我后面的方法调用。
也就是说,我们用firefox和用ie,除了第一句话新建对象时不一样,后面的方法调用都是一样的。
java会自动根据我们上面这句话里创建的对象,去选择他应该执行的实际代码。
这也就是JAVA里的多态,一句话记住多态:用子类对象初始化父类引用,方法调用时自动执行子类代码,成员变量调用时自动调用父类成员变量。
以上,题外话略多,是希望测试人员不要自我放弃,写个程序不会有多难,Java的基础必须要掌握。
driver.get(“http://www.baidu.com”);
调用Webdriver的get方法,跳转到制定的URL;
凡是这里跳转不过去的,十有八九是因为webdriver版本太低,浏览器版本太高,请改上一节讲的pom.xml里配置的webdriver版本号至最新版。
driver.findElement(By.id(“kw1”)).sendKeys(“GitHub”);//输入搜索关键字“GitHub";input search keyword
driver.findElement(By.id(“su1”)).click();//点击搜索按钮click the search button
这里调用Webdriver的findElement方法来查找页面元素。然后在找到的页面元素WebElement对象上调用sendKeys方法来打字和click方法来点击。
如果你问我这个id的值是怎么来的,那么你可以去看一下FireBug这个插件,他会替你找到每一个元素的一切属性。
如果你要定位的元素没有id,你还可以用className,Xpath,css,等等来定位。
另一个插件FirePath可以帮你产生任意元素的xpath表达式。
findElement方法需要一个By类型的参数。
但是代码里我们使用了By.id(“kw1”) 这里的id是一个静态方法,他的声明是:
public static By id(java.lang.String id)
所以我们调用By.id的时候,他会返回一个By类型的对象给我们。
至于下面findElement是怎样用这个对象来查找页面元素的,暂时不讲。简单来说,就是把我们传入的id传给对应的Driver,由driver去查找元素,再返回给我们。
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
很常用的一个等待页面加载的语句。这个implicityWait是会对driver的下一个findElement调用起作用的。
百度这个搜索结果页面很有意思,虽然我们感觉不出来,但搜索结果其实是异步显示上去的,所以不加等待他就会找不到元素。
而后面点击搜索结果打开一个窗口的时候我们再次用了等待。
另外,这个方法并不是对所有网页都有效,有时我们要用一些别的等待。还有尽量不要用Thread.sleep
String aResult=driver.findElement(By.xpath(".//*[@id=‘4’]/h3/a")).getText();//取第四条搜索结果的标题。 get the text of 4th search result
assert aResult.contains(“GitHub”);//做断言 assertion
这两句,首先去取实际结果,也就是根据某个xpath表达式找到的搜索结果元素上的Text
然后,再判断他是否符合预期结果,即包含有“GitHub”这个字符串。
assert是TestNG提供的,这里不要用if else去判断这个字符串。TestNG的assert结果会反映在测试报告里。
也不要自己去抛出一个代表断言失败的异常,TestNG会替你完成这件事。
以上两个错误是中低级开发人员编写测试框架时常犯的。
我们既然用了TestNG,请至少尝试去用TestNG的功能。
for(String winHandle : driver.getWindowHandles()){
driver.switchTo().window(winHandle);
}
这段代码表示切换窗口。有意思的是,他是在窗口打开后,先取出所有窗口的hanles,然后一个一个切过去。
因为新窗口必定在最后,所以不论你有几个窗口,这段代码总能找到最新一个窗口。如果你还需要操作老窗口,
可以事先把老窗口的Handle保存起来,以后再切回来。
以上一个简单的线性测试脚本编写完毕。基本的元素定位、元素操作、窗口切换、断言都有了,你可以查看官网的文档,了解各个api的更多方法。
熟练地编写线性脚本大概需要个把月,有编程基础的更快,这一篇介绍的内容基本没有难度。下一篇介绍进阶的线性脚本,包括frame,actions,关闭浏览器,运行javascript,WebDriverWait。
自动化脚本——java相关推荐
- java实现客户端脚本录制_(二)appium-desktop录制脚本二次开发,生成我司自动化脚本...
目的 对appium-desktop脚本录制功能进行二次开发,增加录制ATK脚本功能.录制样式为 {"preSteps": [----------前置条件为打开页面PG或者启动Dr ...
- python自动化办公脚本下载-python自动化脚本
广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 运维自动化,已经成为运维必不可少的一部分,下面附上自己写的监控nginx_stat ...
- java平台脚本+java编译器API
[0]README 0.1)本文文字描述转自 core java volume 2, 旨在学习 java平台脚本+java编译器API 的 基础知识: ----------------------- ...
- python和selenium爬虫,网页表格下载自动化脚本
一.selenium是啥 框架底层使用JavaScript模拟真实用户对浏览器进行操作.测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度 ...
- 怎么保证自动化脚本没有问题_质量保证将使设计变得自动化
怎么保证自动化脚本没有问题 As changes in the world pick up speed, machine learning pioneers steer new technologic ...
- 纯java的方式实现自定义自动化部署java项目
纯java的方式实现自定义自动化部署java项目 前言 使用第三方的服务或插件实现部署所存在的问题 自动化部署java项目 java项目部署方式 流程 代码实现 打包 使用 java 执行 cmd 进 ...
- Centos7下的LibreOffice的搭建及自动化脚本部署
Centos7下的LibreOffice的搭建及自动化脚本部署 LibreOffice 简介 LibreOffice 是一个强大的办公套件 – 它清晰的界面和强大的工具让您释放您的创造力并增长您的生产 ...
- 界面自动化脚本开发案例
文章目录 Selenium介绍 使用自动化脚本删除网站通知 使用自动化脚本发送弹幕 对注册功能进行自动化测试 日期控件的操作 使用自动化脚本上传头像 浏览器导航事件模拟(刷新.前进.后退) 普通下拉框 ...
- linux集群自动化脚本和增量复制
linux集群自动化脚本和增量复制 Linux集群shell自动化脚本和集群增量增量复制 xcall.sh代码: xcall.sh脚本解释: xsync.sh代码: xsync.sh脚本解释: 自定义 ...
最新文章
- 微软发布全新多核心操作系统原型:Barrelfish
- 图解Istio原理和实践--云平台技术栈18
- Lidar与IMU标定代码实战:lidar_align
- 十大Material Design开源项目
- Spring MVC @ModelAttribute 数据绑定
- 数据结结构学习 ---赫夫曼树
- SQL Server-数据类型(七)
- sql server 常用语句
- debug.keystore文件找不到
- dp - 2016腾讯笔试 A
- 使用WebBrowser自动登录阿里妈妈网站
- PHP之数组元素的排序
- 【AHOI2009】【BZOJ1798】Seq 维护序列seq(线段树模板,易错提醒)
- xcode6 使用MJRefresh
- 专访数科网维总经理王少康:把OFD文档做成信息时代的“数字纸张”
- 计算机中的c盘d盘,怎么把电脑中的D盘转换成C盘并删除原C盘系统
- Android实时日志查看工具Logcat
- 服务器虚拟化太金苹果效果好,《我的世界》金苹果更新速度太快,如今附魔金苹果“可遇不可求”...
- 【论文】caj文件打开方式
- 共享扫码娃娃机无现金化扫码支付
热门文章
- 如何学素描——新手学素描最容易犯的…
- 零基础学素描nbsp;nbsp;nbsp;头…
- Docker 离线安装 .net Core 6.0 环境部署
- python定义字符串类型_Python数据类型之字符串
- 2018java对笔记本配置要求_2018CAD对笔记本电脑的最低配置要求?
- 记住这些快捷键,让你轻松玩转mac(macOS 常用快捷键分享)
- mysql查找多个姓氏_同时搜索2个字段以从MySQL的表中获取特定的名字和姓氏
- 跟我学SpringBoot之Logging
- 办公小技巧:Word竖向求和
- leetcode 1005 Maximize Sum Of Array After K Negations