第三章 Webdriver Java API简介(上)
------Web自动化测试之Webdriver+TestNG--从零到熟练(系列)
WebDriver也就是业界通称的Selenium 2.0,是页面自动化的通用框架,支持java, python, php等多种语言。也是其他自动化,如手机自动化化的基础。官方出了一个帮助文档,详细讲解了Webdriver Java API的相关操作,本章我们就不一一讲述了,把常用的给讲解一下,为后续的章节做准备。
3.1 打开浏览器
在对页面进行测试之前,我们需要在特定的浏览器中打开我们要测试的页面。Webdriver支持多种浏览器,常用的打开方法如下:
(1)打开firefox浏览器:
WebDriver driver=new FirefoxDriver();
(2)打开IE浏览器:
WebDriver driver=new InternetExplorerDriver();
(3)打开HtmlUnit浏览器:
WebDriver driver=new HtmlUnitDriver()
说明:运行这段代码,可以打开对应的浏览器,firefox和IE浏览器自不必说,很常用的两个浏览器。至于HtmlUnitDriver这个大家就不常见了,这是一个内存级运行的驱动浏览器。测试用例在内存中运行,不会打开页面,运行速度比较快,但是也有缺点如果程序出错,不能直观地看到错误的现象。对javascript支持不好,如果页面包含太多的JS,经常会捕捉不到页面元素。
(4)打开要测试的URL
Driver.get(URL);
3.2 页面元素定位方法
要完成对页面元素进行操作,首先要先定位到这个页面元素,通常常用的页面元素定位方法有如下几种:
(1)通过ID定位
例如:页面有如下元素:
要对这个元素进行定位,则可以利用下面的语句:
WebElement element=driver.findElement(By.id(“password”));
(2)通过name定位
例如:页面元素如下:
要定位这个元素,可以使用下面的语句:
WebElement element=driver.findElement(By.name(“username”));
(3)通过xpath定位
例如:有如下的页面元素:
要定位img标签,则需要下面的Xpath定位语句:
WebElement element=driver.findElement(By.xpath(“//a[@class=’sitelogo’]/img”));
(4)通过class name定位
例如:还是个这页面元素:
不过我们此时要定位的是a标签,则定位语句如下:
WebElement element=driver.findElement(By.className(“sitelogo”));
(5)通过linkText定位
例如:有页面元素如下:
www.zhongchou.com”> 筹小钱办大事
则定位这个元素的时候,我们可以用以下方法:
WebElement element=driver.findElement(By.linkText(“筹小钱办大事”));
(6)通过Css定位
例如,有如下页面元素:
则定位这个元素的时候,我们可以用以下方法:
WebElement element=driver.findElement(By.cssSelector(“input#kw.s_ipt”));
常用的定位方法就这六种,不过通过一个页面元素可以使用不止一种定位方法,所以此时我们就要选择合适的定位方法来编写我们的测试用例。
3.3 页面常用元素操作
虽然在一个页面上的元素很多,可是我们常用的操作就那么几个元素,操作方法也是有限的,下面我们介绍一下常用元素的操作,我们以后的测试用例就是由这些儿操作组成的。
(1) 输入框(input)
A,查找输入框元素:
WebElement element=driver.findElement(By.id(“password”));
B,向输入框内输入内容:
element.sendKeys(“HelloWorld!”);
C,清空输入框内容:
element.clear();
D,获取输入框中的内容:
element.getText();
(2)按钮(button)
A,定位按钮
Webdriver savebtn=driver.findElement(By.id(“save”));
B,点击按钮:
savebtn.click();
C,判断按钮是否可点击:
savebtn.isEnabled()
(3)下拉选择框(Select)
A,定位下拉选择框:
Select select=new Select(driver.findElement(By.id(“select”)));
B,选择对应的选择项:
select.selectByVisibleText(“item1”);
or
select.selectByValue(“item1”);
C,不选择对应的项
select.deselectAll();
select.deselectByValue(“item1”);
select.deselectByVisibleText(“item1”);
D,获取选择项的值
select.getAllSelectedOptions();
select.getFirstSelectedOptiion();
(4)单选按钮(Radio Button)
A,定位单选框元素
WebElement sexsel=driver.findElement(By.id(“sex”));
B,选择单选按钮
sexsel.click();
C,清空某个单选项:
sexsel.clear();
D,判断选项目是否已选中:
sexsel.isSelected();
(5)复选按钮
A,定位单选框元素
WebElement city=driver.findElement(By.id(“city”));
B,选择复选框
city.click();
C,清空某个选项:
city.clear(); or city.click();
D,判断选项目是否已选中:
city.isSelected();
(6)窗口与Frame间的切换
A,先切换到默认句柄
driver.switchTo().defaultContent();
B,切换到Frame:
driver.switchTo().frame(“frame1”);
C,切换到Window:
driver.switchTo().window(“windowName”);
注:在我们日常的自动化测试中,经常会遇到,这种切换,如果我们忘记了写切换语句,则会出现我们用定位工具明明能找到的元素,在自动化测试用例中一直报找不到的错误。此时,不用反复更改定位方式,只需要看一下操作过程中是否改变了窗口或是进入了frame中。
3.4 定位方法的选择
页 面元素的定位,是页面自动化测试过程中的首要任务及重中之重。如果连元素都定位不到,再好的测试框架,高超的编程技巧,也无法完成自动化测试用例的编写。 上面我们讲解了基本的定位方法,所以本节我们就从最基本的开始,当我们欲定位一个页面元素的时候,应该如何选择定位方法。
为了简单期间,我们就以百度为例,来讲解页面元素定位方法选择的思路。现有一个测试用例如下:
测试步骤:
(1) 打开百度首页,输入“自动化测试”。
(2)百度一下,检测搜索结果
分析:
(1)打开百度没有任何问题,直接调用WebDriver API就行了。可是要输入“自动化测试”,我们首先要定位到输入框架,然后再能输入要查询的关键字。
(2)百度一下,要定位到“百度一下”按钮,才能执行单击操作。检测搜索结果的时候,需要在查询结果页定位查询到的网页标题或是内容,才能检测。
至此我们明白自动化要做的内容,就可以着手去编写自动化测试用例。至于如何编写是以后章节的内容,本节我们主要关注元素定位的部分。现在我们按如下步骤进行定位:
第一步:用火狐打开百度首页。
我们之所以用火狐打开百度,是想利用火狐的插件Firebug来定位元素。
第二步,用Firebug查找定位的元素。
Firebug想必大家已经不会陌生,如果实在没有用过,就去网上搜一下这是个什么东东。我们打开firebug,利用“点击查看页面中的元素”按钮,点击输入框,则firebug会以选中状态显示输入框在HTML中的标签。如图3.4.1 所示:
图3.4.1选中状态显示输入框
第三步,分析选择定位方法。
我们先分析一下这个标签的特点:
- 这是一个input标签,所以说Tag Name是input,通过我们查看网页源码,发现不是只有一个这样的标签,所以不能用TagName来定位。
- 分析标签的属性,发现标签中具有我们特别感兴趣的属性class,name,id,这三个属性可以用来定位,而autocomplete,maxlength,value经过分析是不可用的,所以舍弃。
- 假如标签不存上面的三个属性,我们就考虑一下能否用Xpath和CSS。
方法:从此标签向上查找,遇到一个它的上级标签,就去找有没有唯一的属性,如果有,从此层往下写Xpath或Css,如果没有,接着向上层查找。
本标签的上一级标签是span,span有Class属性,但其值中有空格,不能使用Xpath(原因见下节),但可以使用Css,Css的定位方法是:input#kw.s_ipt。
- Xpath定位方法,我们接着上面继续向上查找,再上一级是form标签,这个标签有id,name,class属性,比较适合用来定位,所以从此层开始写Xpath是://form[@id=’form’]/span/input 或//form[@name=’f’]/span/input 或//form[@class=’fm’]/span/input。
- 这个标签不是超级链接,所以不能用link相关的定位方法。
第四步,编写定位代码
针对该标签,我们现在把能用的定位方法全部写下来:
- id: driver. findElement(By.id(“kw”))
- name: driver. findElement(By.name( “wd”))
- class: driver. findElement(By.className (“s_ipt”))
- css: driver. findElement(By.cssSelect (“input#kw.s_ipt”))
- xpath:driver. findElement(By.xpath (“//input[@id=’kw’]”))
由此可见一个页面元素的定位方法是相当多的,我们可是根据需要选择。然后再放到代码中去调试,如果不行,就换另外的办法。原则是:越简单的定位方法越好,因为这样的定位方法受到网站改版的影响也越小。
第五步,工具使用定位
经过上面四步我们已经可以定位页面上的元素了,不过这都是通过我们人工来查看的,然后手动编写的代码。有没有更加简单的方法来定位呢?答案是Yes,我们要用到的就是传说中的FireBug和Selenium IDE。下面我们简单地介绍一下使用方法:
(1) Firebug提取元素的Xpath,Css路径。
元素的id,name,class属性一目了然,直接可以使用,如果元素没有这几个属性,就需要用Xpath和Css路径定位了。但是这两个路径不太容易写出来,所以Firebug提供了方法。
首先,我们用Firebug找到要定位的元素。然后右击这个元素在Firebug中的位置,从弹出的菜单中选择“复制Xpath”,“复制最简Xpath”或是“复制CSS路径”。最后将复制到的内容粘贴出来,这就是对应页面元素的xpath或是Css路径。如图3.4.2所示:
图3.4.2
提取页面元素的CSS or Xpath路径
(2) Selenium IDE验证提取的路径是否正确。
通过Firebug我们可以提取出元素的Css或者Xpath的路径,可是提取的究竟对不对呢?工具有的时候也不太靠谱,所以我们要验证一下。最直接的办法就是放到测试用例中去执行一下,但是一直在执行测试用例,这样比较耗时。我们可以借助于Selenium IDE来验证一下。
验证方法如下:
- 用FireBug提取出要定位的元素的Xpath或者Css路径。
- 打开Selenium IDE界面,右击界面“Insert new command”。
- 将复制的路径粘贴到IDE的Target文本框中,如果复制的是Css路径,需要在复制的路径前加上“Css=”。
- 单击Find按钮,此时Firebug中显示的要定位的元素会标黄显示,表示定位正确。如图3.4.3所示:
图3.4.3
验证定位元素正确的情况
- 如果复制的路径不对,则IDE会在log区以红色的信息提示定位不到。如图3.4.4所示:
图3.4.4
验证定位元素定位不到的情况
注意:
Firebug提交的路径一般都是从页面起始位置标签开始,一直提取到要定位的元素,是相对路径,容易受到网页变化的影响。不建议直接使用,只可以作为参考。
Selenium IDE验证定位方法,不仅仅可以验证Firebug复制的路径,还可以验证我们自己编写的路径,比用代码验证方便快捷。这种验证方法是我的最爱,节省了不省时间。