第三章 Webdriver API简介(上)
------Web自动化测试之Webdriver(python)--从零到熟练(系列)
Selenium 2.0主要的特性就是与WebDriver API的集成。WebDriver旨在提供一个更简单,更简洁的编程接口以及解决一些Selenium-RC API的限制。Selenium-Webdriver更好的支持页面本身不重新加载而页面的元素改变的动态网页。WebDriver的目标是提供一个良好设计的面向对象的API,提供了对于现代先进web应用程序测试问题的改进支持。
3.1 Webdriver API
Web应用程序的测试主要是基于调用Webdriver Api来模拟用户操作,然后判断操作结果是否与预期的一致,从而达到自动化测试的目的。所以熟悉Webdriver的API的使用很重要,也是我们在做自动化测试的先决条件。
Webdriver API网上有官方文档,不过由于种种原因吧,官网不太容易打开。所以我们可以在百度中去搜索相关的文档,结果也非常多。不同语言的API有点儿不太一样,由于我们采用的是Python作为脚本语言,所以建议看出Python版的,推荐以下两个网页:
(1)selenium_webdriver(python)第一版:http://wenku.baidu.com/link?url=PDcKQYNL-iVRlahMunWoY1BDMw5vyUvv-AFCtC6eUCfG0R5XdC0SnBCHdp742uY6riA25FdBfaUtL-N2uZiXj6PXxIyRGcI-bV1QEYSZHGW
(2)虫师的翻译:http://www.cnblogs.com/fnng/archive/2013/06/16/3138283.html
这两篇文档刚好是一个人的,我看了一下写的比较详细,大家就去自行学习一下吧。
关于Webdriver API的一点儿说明:
Ø API只是一些儿封闭的方法,大致浏览一下,知道有哪儿些API,完成什么操作即可,没有必要花很多时间去学习,边用边学。
Ø API的学习要灵活,最好把同类的操作放到一起比较一下。因为在编写测试用例的过程中,不仅仅只有一种方法可以达到预期的结果。
Ø 要会使用Eclipse的联想功能。在写测试用例的时候,如果一时想不起来用什么方法了,可以利用联想功能进行查询。
本章我们就不详细讲解这些儿API的使用方法了,重点将放到页面元素的定位及检查点的设置,这些儿是体现一个自动化测试工程师水平的重点。
3.2 页面元素定位
自动化测试是模拟用户对页面元素进行操作的,所以在操作之前,需要先定位到要操作的页面元素。如果页面元素都定位不到,其他的操作将无从谈起。而对页面元素定位技巧,随着经验的增加,将会越来越精准。而在此,我们将从基础谈起,然后再逐步加深!
3.2.1 WebElement对象提供的各种定位元素策略
下面我们先来讲解一下WebElement对象提供的各种常用的定位元素策略:
Ø 通过ID定位元素:
ID:driver. find_element_by_id()
示例:当一个页面元素如下,明显包含id属性,而且属性值是固定的时候,可以使用这个定位方法。
##<</SPAN>div id="nav" class="m-subnav">…..
Ex: driver. find_element_by_id(“nav”)
Ø 通过Name定位元素:
Name:driver. find_element_by_name()
示例:当一个页面元素如下,明显包含name属性,而且属性值是固定的时候,可以使用这个定位方法。
##用户名/手机号/邮箱" wx-validator-username-required="*请输入账号" wx-validator-rule="required" name="username" class="foc" placeholder="用户名/手机号/邮箱">
Ex: driver. find_element_by_name(“username”)
Ø 通过ClassName定位元素:
className:driver. find_element_by_class_name()
示例:当一个页面元素如下,明显包含name属性,而且属性值是固定的时候,可以使用这个定位方法。
##<</SPAN>div class="bx-wrapper" style="max-width: 100%;">….
Ex: driver. find_element_by_class_name(“bx-wrapper”)
Ø 通过TagName定位元素:
tagName:driver. find_element_by_tag_name ()
示例:当一个页面元素如下,这是一个form元素,如果本页中只有一个form,可以使用这个定位方法。
##<<SPAN style="COLOR: red">form wx-validator="" method="get" action="/deals" >
##
##输入关键词" name="k" placeholder="输入关键词">
##
##
##</<SPAN style="COLOR: red">form>
Ex: driver. find_element_by_tag_name(“form”)
Ø 通过LinkText定位元素:
linkText:driver. find_element_by_link_text ()
示例:当一个页面元素如下,明显是一个超级链接,可以使用这个定位方法。
##"http://www.google.com/search?q=cheese">cheese
Ex: driver. find_element_by_link_text(“cheese”)
Ø 通过PartialLinkText定位元素:
partialLinkText:driver. find_element_by_partial_link_text ()
示例:当一个页面元素如下,明显是一个超级链接,但是超级链接显示的文字比较长的时候,可以使用这个定位方法,通过部分文字定位。
##"http://www.google.com/search?q=cheese">search for cheese
Ex: driver. find_element_by_link_text(“cheese”)
Ø 通过CSS定位元素:
css:driver. find_element_by_css_selector ()
示例:当一个页面元素如下,这个可以使用CSS定位。
##
##
……
##
##
Ex:driver. find_element_by_css_selector(“#div.m-right.clearfix span.z-Login”)
Ø 通过Xpath定位元素:
xpath:driver. find_element_by_xpath ()
示例:当一个页面元素如下,div中嵌套h3,h3中嵌套a标签,现在我们要定位这个a标签的元素。现在我们采用xpath定位方法:
##
##
##
##
##
Ex:driver. find_element_by_xpath(“//div[@class=’ lev_Box lev_Box_noborder’]/h3/a”)
以上是WebElement对象提供的定位方法,这八种方法是最基本的。不过大家要有这样的一个共识,元素定位不只是有一种方法能定位到。一个页面元素可以通过很多种方法来定位,要选择一个比较恰当的方法,这就需要一些儿技巧和经验了。
3.2.2 定位方法的选择
页面元素的定位,是页面自动化测试过程中的首要任务及重中之重。如果连元素都定位不到,再好的测试框架,高超的编程技巧,也无法完成自动化测试用例的编写。所以本节我们就从最基本的开始,当我们欲定位一个页面元素的时候,应该如何选择定位方法。
为了简单期间,我们就以百度为例,来讲解页面元素定位方法选择的思路。现有一个测试用例如下:
测试步骤:
(1) 打开百度首页,输入“自动化测试”。
(2)百度一下,检测搜索结果
分析:
(1)打开百度没有任何问题,直接调用WebDriver API就行了。可是要输入“自动化测试”,我们首先要定位到输入框架,然后再能输入要查询的关键字。
(2)百度一下,要定位到“百度一下”按钮,才能执行单击操作。检测搜索结果的时候,需要在查询结果页定位查询到的网页标题或是内容,才能检测。
好了,目前我们明白自动化要做的内容了,就可以着手去编写自动化测试用例。至于如何编写是以后章节的内容,本节我们主要关注元素定位的部分。现在我们按如下步骤进行定位:
第一步:用火狐打开百度首页。
我们之所以有火狐打开百度,是想利用在第二章我们讲到的火狐的插件来定位元素。
第二步,用Firebug查找定位的元素。
Firebug想必大家已经会使用了,我们打开firebug,利用“点击查看页面中的元素”按钮,点击输入框,则firebug会以选中状态显示输入框在HTML中的标签。如图3.2.2.1 所示:
图3.2.2.1选中状态显示输入框
第三步,分析选择定位方法。
我们先分析一下这个标签的特点:
Ø 这是一个input标签,所以说Tag Name是input,通过我们查看网页源码,发现不是只有一个这样的标签,所以不能用find_element_by_tag_name来定位。
Ø 分析标签的属性,发现标签中具有我们特别感兴趣的属性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. find_element_by_id(“kw”)
Ø name: driver. find_element_by_name(“wd”)
Ø class: driver. find_element_by_class_name(“s_ipt”)
Ø css: driver.find_element_by_css_selector(“input#kw.s_ipt”)
Ø xpath:driver.find_element_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.2.2.2所示:
图3.2.2.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.2.2.3所示:
图3.2.2.3 验证定位元素正确的情况
Ø 如果复制的路径不对,则IDE会在log区以红色的信息提示定位不到。如图3.2.2.4所示:
图3.2.2.4 验证定位元素定位不到的情况
注意:
Firebug提交的路径一般都是从页面起始位置标签开始,一直提取到要定位的元素,是相对路径,容易受到网页变化的影响。不建议直接使用,只可以作为参考。
Selenium IDE验证定位方法,不仅仅可以验证Firebug复制的路径,还可以验证我们自己编写的路径,比用代码验证方便快捷。这种验证方法是我的最爱,节省了不省时间。