selenium自动化测试学习3-元素定位

一.元素定位的重要性

可以这样来说,自动化测试的根本就是准确的操作被测试对象,操作被测试对象的前提就是元素定位。

二.常用的定位方法

1.常用的定位方法有如下几种:

selenium自动化测试学习3-元素定位

其中最常用的定位方式有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的使用:此种定位的应用场景为:

selenium自动化测试学习3-元素定位此种场景的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&amp;wd=111&amp;usm=3&amp;ie=utf-8&amp;sl_lang=en&amp;rsv_srlang=en&amp;rsv_rq=en&amp;rqlang=cn">英文结果</a>

可见这四个字没有任何属性值信息,所以定位此信息的时候需要使用text()函数。

 selenium自动化测试学习3-元素定位

此时定位英文结果即可使用://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属性建议百度恶补下。

最后请记住定位没有最好,只有是否合适。选择最合适的定位方法,就能使得定位变得得心应手。