⾃动化脚本——java
⾃动化脚本
本⽂将介绍⼀个Java+TestNG+Maven+Selenium的web⾃动化测试脚本环境下lenium简单线性脚本的编写,并提供全部代码。
⽂中将看到,使⽤lenium编写⼀个能操作浏览器的脚本是⾮常容易的。⽽简单线性脚本的编写是下⼀步编写页⾯对象脚本的基础。
1.在开始之前,我想明确⼀下,⾃动化测试的基本原理。
有的测试⼈员认为⾃动化测试很神秘,很神奇。恰恰相反, ⾃动化测试很简单 。
⾃动化测试,⼀般分三个步骤:
1)取预期结果;
2)取实际结果;
3)断⾔:⽐较1)和2)来判断测试是否通过;
从历史⾓度来看,⾃动化测试的出现早于专职测试⼈员的出现。也就是说在开始有我们这些专门做软件测试的测试⼈员之前,⾃动化测试已经存在了。
原因就是他 简单 。
祛斑美白lenium⾃动化测试,在⾃动化测试⾥也是属于超级 简单 的⼀类。但前提是必须理解上⾯说的⾃动化测试原理,以及其他⼀些⾃动化测试设计原则。否则,我们将会看到, 简单的项⽬也会失败 。有很多由初、中级开发⼈员或会⼀点点代码的测试⼈员编写的lenium⾃动化测试项⽬,因此失败。
2.简单的lenium测试脚本编写,⼀般也是分三个步骤:
1)定位⼀个元素
2)操作⼀个元素
3)断⾔
好,这⾥⽤百度⾸页的搜索做⼀个例⼦:
‘’'java
1 st;
2
3 import urrent.TimeUnit;
4
5 import ;
6 import org.openqa.lenium.WebDriver;
7 import org.openqa.lenium.firefox.FirefoxDriver;
8 stng.annotations.Test;
9
10 public class TestBaiduHome {
11
12 @Test
13 public void archSomething(){
14
15 WebDriver driver=new FirefoxDriver();//打开Firefox; open firefox
(“”);//打开百度open the url
17 driver.findElement((“kw1”)).ndKeys(“GitHub”);//输⼊搜索关键字“GitHub";input arch keyword
18 driver.findElement((“su1”)).click();//点击搜索按钮click the arch button
19 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//等页⾯加载,10秒内不加载成功即报超时。waiting for 10 conds
20 String aResult=driver.findElement(By.xpath(".//[@id=‘4’]/h3/a")).getText();//取第四条搜索结果的标题。 get the text of 4th arch result
21 ains(“GitHub”);//做断⾔ asrtion
22 driver.findElement(By.xpath(".//[@id=‘4’]/h3/a")).click();//打开第四个搜索结果。Open the 4th arch result on baidu
23 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//等页⾯加载,10秒内不加载成功即报超时。waiting for 10 conds
24
25 //获取所有窗⼝的handle,然后逐个切换,直到切换到最新窗⼝ switch to the new window
26 for(String winHandle : WindowHandles()){
27 driver.switchTo().window(winHandle);
28 }
29
30 String Title();//取新窗⼝的title
31 System.out.println(“current widnow title is:”+aTitle);//打出来看看
32 ains(“GitHub”);//断⾔
33
34 }
35 }
‘’’
View Code
战网积分本系列所有代码/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的基础必须要掌握。
<(“”);
调⽤Webdriver的get⽅法,跳转到制定的URL;
凡是这⾥跳转不过去的,⼗有⼋九是因为webdriver版本太低,浏览器版本太⾼,请改上⼀节讲的l⾥配置的webdriver版本号⾄最新版。
driver.findElement((“kw1”)).ndKeys(“GitHub”);//输⼊搜索关键字“GitHub";input arch keyword
driver.findElement((“su1”)).click();//点击搜索按钮click the arch button
这⾥调⽤Webdriver的findElement⽅法来查找页⾯元素。然后在找到的页⾯元素WebElement对象上调⽤ndKeys⽅法来打字和click⽅法来点击。
男皮带如果你问我这个id的值是怎么来的,那么你可以去看⼀下FireBug这个插件,他会替你找到每⼀个元素的⼀切属性。
背乡离井
如果你要定位的元素没有id,你还可以⽤className,Xpath,css,等等来定位。
另⼀个插件FirePath可以帮你产⽣任意元素的xpath表达式。
findElement⽅法需要⼀个By类型的参数。
(“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 arch result
ains(“GitHub”);//做断⾔ asrtion
这两句,⾸先去取实际结果,也就是根据某个xpath表达式找到的搜索结果元素上的Text
然后,再判断他是否符合预期结果,即包含有“GitHub”这个字符串。
asrt是TestNG提供的,这⾥不要⽤if el去判断这个字符串。TestNG的asrt结果会反映在测试报告⾥。
也不要⾃⼰去抛出⼀个代表断⾔失败的异常,TestNG会替你完成这件事。
以上两个错误是中低级开发⼈员编写测试框架时常犯的。
我们既然⽤了TestNG,请⾄少尝试去⽤TestNG的功能。
平凡的精彩for(String winHandle : WindowHandles()){
driver.switchTo().window(winHandle);
}
这段代码表⽰切换窗⼝。有意思的是,他是在窗⼝打开后,先取出所有窗⼝的hanles,然后⼀个⼀个切过去。
因为新窗⼝必定在最后,所以不论你有⼏个窗⼝,这段代码总能找到最新⼀个窗⼝。如果你还需要操作⽼窗⼝,
可以事先把⽼窗⼝的Handle保存起来,以后再切回来。
以上⼀个简单的线性测试脚本编写完毕。基本的元素定位、元素操作、窗⼝切换、断⾔都有了,你可以查看官⽹的⽂档,了解各个api的更多⽅法。
熟练地编写线性脚本⼤概需要个把⽉,有编程基础的更快,这⼀篇介绍的内容基本没有难度。下⼀篇介绍进阶的线性脚本,包括
300字周记frame,actions,关闭浏览器,运⾏javascript,WebDriverWait。