selenium自动化测试学习3-元素定位
一.元素定位的重要性
可以这样来说,自动化测试的根本就是准确的操作被测试对象,操作被测试对象的前提就是元素定位。
二.常用的定位方法
1.常用的定位方法有如下几种:
其中最常用的定位方式有by.id和by.xpath以及by.cssSelector,其他的定位方式使用较少。
2.对于最常用的xpath定位的说明
首先如果你自己不会写xpath定位,没有关系可以借助火狐浏览器的firepath进行定位。
如果想弄明白xpath定位的原理,需要掌握以下方面。
2.1xpath常用符号说明
/:表示绝对路径,绝对路径是指从跟目录开始
//:表示相对路径
.:表示当前层
..:表示上一层
*:表示通配符
@:表示属性
[]:属性的判断条件表达式
那么观察完上面的符号,我们就应该明白要想使用上面的符号准确写出一个被测试对象的xpath,那么必须先掌握标记语言xml、html的层次结构(或者说是格式)。
2.2任找一个Html网页进行定位实战
练习以下几种元素的定位:
2.2.1按照页面代码结构逐级定位
(1)/html/div:没有节点可以被选择,因为/代表绝对路径,本定位表示的是html下一级目录的元素,很明显html的下一级是head和body,所以本写法无法定位到任何元素。
(2)/html//div:此时选中html标签中的所有div元素,//相对路径。此时就完全等价于//div的写法。
(3)//div/div表示所选择的div元素下又包含div元素的所有元素。此时完全等价于//div/div/.的写法。
(4)//div/div/..:表示//div/div定义到的上一层div上。
(5)//div/div/*:此时会将div下的子节点含有div的这层节点下的所有元素都匹配到。
(6)//div[@id="input"]:此时表示在div目录下选择一个id=input的子节点。
(7)//div[@id="input"]/input:在(6)的基础上匹配其下一层的input子节点。
2.2.2and与or连接符在xpath中的使用
and的使用:此种定位的应用场景为:
此种场景的html编码为:
<td class="widgetStyle"> <div id="radio"> <input class="Volvo" type="radio" name="identity"/> <label>Volvo</label> <br/> <input class="Saab" type="radio" name="identity"/> <label>Saab</label> <br/> <input class="Opel" type="radio" name="identity"/> <label>Opel</label> <br/> <input class="Audi" type="radio" name="identity"/> <label>Audi</label> </div>
此时我们想定位到Saab怎么写呢?(当然也可以不使用and连接符进行书写)书写为://input[@class="Saab" and @name="identity"]当然我就写成//input[@class="Saab"]肯定也不会有问题。
or的使用:此时如果我们定位到Saab或者定位到Opel此时我们的书写方式为://input[@class="Saab" or @class="Opel"]
2.2.3定位顺序(从1开始切记)
还拿上面的例子进行举例:如果我们写成//input[@name='identity'],此时我们定位到的是四个信息,2如果想确定其中任何一个,我们在2.2.2中说使用and进行关联定位想,现在我们学习第二种方式,比如我们想定位Saab。我们可以这样写://input[@name='identity'][2],同理我们定位Volvo,//input[@name='identity'][1](这就是我一开始强调的,这种写法必须从1开始编号)。
定位Opel,写成://input[@name='identity'][3],定位Audi写成//input[@name='identity'][4]
2.2.4常用函数
Xpath定位还可以使用一些函数,常用的函数如下:
(1)contains():包含。此时拿2.2.2的html代码为例进行说明,我们想匹配出Saab还可以这样写。//input[@name="identity" and contains(@class,'S')]
(2)text():一个节点的文本值,举个例子:这里面篮字显示的英文结果,html代码为:
<a target="_self" href="/s?rsv_idx=1&wd=111&usm=3&ie=utf-8&sl_lang=en&rsv_srlang=en&rsv_rq=en&rqlang=cn">英文结果</a>
可见这四个字没有任何属性值信息,所以定位此信息的时候需要使用text()函数。
此时定位英文结果即可使用://a[text()="英文结果"]
(3)last()函数,继续拿2.2.2的源码为例,定位Audi写成//input[@name='identity'][4],可以看到Audi这个元素本身就处于input最后一个了,此时可以使用last()函数进行匹配://input[@name="identity"][last()]
(4)starts-with:以starts-with为开头写法实例://input[starts-with(@id,'user')]代表input下id以user为开头的元素。
(5)not():表示否定,一般情况下会与返回值为true或者false的函数组合起来使用,比如上面我们提到的contains()与starts-with。用实例来说:继续看2.2.2中的那段Html代码,我们现在想要定位到不是Audi车除外的三种车元素,此时写法为://input[@name="identity" and not (contains(@class,'A'))]。
当然not()还有一种特殊用法就是直接Not。//input[not(@class)]表示我们匹配出input下所有不含class属性的元素。
总结:唯一需要注意的是所有函数的写法function(@属性,'内容')。
2.2.5XPATH轴定位说明
(1)基本轴
轴可以在位置路径中快捷引用特定的节点(忽略属性和名称空间节点)。
child 例子
"child::*"
当前节点的子节点。
"child::childnodename"
当前节点名为childnodename的子节点。
"child::text()"
当前节点文本子节点。
"child::node()"
当前节点的子节点。
"child::*/child::nodename"
取当前节点的子节点的名为nodename的子节点。
(2)特殊轴
self 当前节点。
descendant 当前节点的后代(子节点或子节点的子节点...)。
parent 当前节点的父节点。
ancestor 当前节点的祖先节点(父节点和父节点的父节点...)。
preceding 按文档顺序位于当前节点之前的非祖先节点。
attribute 当前节点的属性。
namespace 当前节点的名称空间。
preceding-sibling 当前节点之前的所有兄弟节点。
following 当前节点之后的所有节点。
following-sibling 当前节点之后的所有兄弟节点。
descendant-or-self 当前节点和后代节点。
ancestor-or-self 当前节点和祖先节点。
以上的两种轴类型,没什么好说的,记住。具体怎么用请看下面实例。
第一个实例:继续定位2.2.2中的Volvo使用xpath轴书写如下://div[@id="radio"]/descendant::input[1]也可以定位到。
第二个实例:定义Audi上的所有节点。使用xpath轴写法如下://input[@name="identity" and @class="Audi"]/preceding-sibling::*
(3)需要注意的几个问题。
>>[]后面需要跟/,/后面在加上关键字。
>>轴关键字后面必须使用::,这个后面可以接节点名称例如input,div等。如果后面跟的是*,代表全部。
>>轴后面接节点名称是,节点前面的定位方式全部可以继续适用。
>>对于轴的使用我得建议是能不用就不用,条条大路通罗马,没必要非使用轴进行定位。
3.cssSelector定位(了解,能用xpath就不用cssSelector。原因很简单,html的代码我们更熟悉)
3.1CSS常用符号说明
#:表示id
.:表示class
>:表示子元素,层级
值得注意的是:一个空格也表示子元素,但是所有的后代子元素,就相当于xpath中的相对路径。
想知道所有的CSS属性建议百度恶补下。
最后请记住定位没有最好,只有是否合适。选择最合适的定位方法,就能使得定位变得得心应手。