Selenium--元素定位方式

元素定位的重要性
自动化测试的根本:准确的操作测试对象(元素)
findElement 和 findElements 方法

  1. findElement()
    返回一个WebElement元素
  2. findElements()
    返回一个List,多个WebElement元素

八种定位方式:

1.By.id(id):通过ID 属性查找

By.id(属性id值):2ID查找最有效,也是最快的,如果一个dom节点有ID,那用它是最好的定位方式,而且ID基本上唯一。

HTML 源码:
          <a onclick="return false;" id="lb" name="tj_login" href="https://passport.baidu.com/v2/?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2F">登录</a>
代码例子:
	WebElement element = driver.findElement(By. id("lb")); 

2.By.name(name):通过name属性查找

HTML 源码:
<a class="reg" name="tj_reg" target="_blank" href="https://passport.baidu.com/v2/?reg&amp;regType=1&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2F">注册</a>
代码例子:
	WebElement  element = driver.findElement(By. name("tj_reg"));  

3.By.className(className) :通过classname属性查找

HTML 源码:
<a class="reg" name="tj_reg" target="_blank" href="https://passport.baidu.com/v2/?reg&amp;regType=1&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2F">注册</a>
代码例子:
	WebElement  element = driver.findElement(By.className( "reg"));   

4.By.linkText(链接文本):通过链接文本

HTML 源码:
<a name="tj_setting" href="http://www.baidu.com/gaoji/preferences.html">搜索设置</a>
代码例子:
	WebElement  element =  driver.findElement(By.linkText( "搜索设置" ));

5.By.partialLinkText(部分链接文本):通过部分链接文本

HTML 源码:
<a name="tj_setting" href="http://www.baidu.com/gaoji/preferences.html">搜索设置</a>                                                                                                                       
	WebElement  element =  driver.findElement(By. partialLinkText( "搜索" ));

6.By.cssSelector(Css路径):通过CSS路径

代码例子:
	WebElement element=  driver.findElement(By. cssSelector(“#kw”));

7.By.tagName(name):通过tagname查找

HTML 源码:
<a name="tj_setting" href="http://www.baidu.com/gaoji/preferences.html">搜索设置</a>
代码例子:
	WebElement element=  driver.findElement(By. tagName( “a" ));

8.By.xpath(XPath路径):通过XPath查找

代码例子:
	WebElement element=  driver.findElement(By. xpath( “.//*[@id='kw']" ));

XPath 是在XML文档中查找信息的一种语言,XPath 可用来在 XML 文档中对元素和属性进行遍历.
虽然XPath 是用来查找XML节点,但同样可以用来查找HTML文档中的节点,因为HTML和XML结构类似。

表达式描述
/从根节点选取。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.选取当前节点。
…(两点)选取当前节点的父节点。
@选取属性。
[ ]属性的判断表达式

/html/div ,没有节点可以被选择,因为/如果用在中间,表示绝对路径,是上一个节点的子结点,而html的子节点是head与body
/html//div ,表示选择根目录下的所有的子孙后代节点中的div节点,//表示相对路径
//div ,表示选择所有的div节点,可以想想/html//div与//div为什么结果是一样的!
//div/div ,表示选择所有的div节点的子节点中含有div的节点
//div/div/. ,表示选择//div/div节点的当前层的节点,与//div/div的结果相同
//div/div/… ,表示选择//div/div节点的上一层节点,也就是选择一个div节点,该div节点的子节点有div节点。有点绕口,但细细理解,会恍然大悟的
//div/div/* ,表示选择//div/div的所有子节点,//div/div会有两个匹配出来的节点,但为什么//div/div/*只有一个了呢?这是因为第二个//div/div下面没有子节点了,所以只匹配出来了一个
//div[@id=‘input’] ,表示选择一个id为’input’的div节点
//div[@id=‘input’]/input ,表示选择一个id为’input’的div节点的input子节点
//table//input[@id=‘user’] ,表示选择table的子孙后代中id为user的input节点
//input[@name=‘identity’ and @class=‘Volvo’] ,有的节点,只用一个属性无法定位出来,必须要用到多个属性进行组合定位,用连接符and。这个XPATH表示选择一个name为identity并且class为Volvo的input节点
//input[@name=‘identity’ or @class=‘Volvo’] ,这个多属性组合用的是or的连接符,这个XPATH表示选择一个name为identity,或者class为Volvo的节点,所以,这个XPATH匹配出来了4个节点
//input[@name=‘identity’ or @class=‘Volvo’],我们刚知道了,//input[@name=‘identity’ or @class=‘Volvo’]匹配出4个,我们只需要第一个,怎么办?加index即可://input[@name=‘identity’ or @class=‘Volvo’][1],请注意,xpath的index是以1开头的,并不是0,请切记!
取最后一个,//input[@name=‘identity’ or @class=‘Volvo’][last()]

需要特别注意的一个地方:
//table//tr//input ,这个匹配出来的,有14个节点,但是如果我们需要取到第一个,怎么办?
有可能会用到://table//tr//input[1],但是我们来看看结果,匹配出来的节点居然是8个,而不是1个,这是因为//table//tr//input[1]是指先匹配出//table下面的所有的tr子孙后代节点,并且再此基础上,再匹配出tr节点的所有的子孙后代中的input结点的第一个,由于tr众多,所以匹配出的结果肯定不是一个,但如何能匹配出1个?也就是说我们需要把众多的tr给固定出一个,这时候再看:
//table//tr[1]//input[1],这时候就只有一个匹配出来的节点,所以,请大家仔细揣摩这里面的区别,细细体会

XPATH的几个常用函数:

  1. contains (): //div[contains(@id,‘in’)] ,表示选择id中包含有’in’的div节点
  2. text():由于一个节点的文本值不属于属性,比如“baidu”,所以,用text()函数来匹配节点://a[text()=‘baidu’]
  3. last():前面已介绍
  4. starts-with(): //div[starts-with(@id,‘in’)] ,表示选择以’in’开头的id属性的div节点
  5. not()函数,表示否定,//input[@name=‘identity’ and not(contains(@class,‘a’))] ,表示匹配出name为identity并且class的值中不包含a的input节点。 not()函数通常与返回值为true or false的函数组合起来用,比如contains(),starts-with()等,但有一种特别情况请注意一下:我们要匹配出input节点含有id属性的,写法如下://input[@id],如果我们要匹配出input节点不含用id属性的,则为://input[not(@id)]

XPATH的轴的概念:
在这里插入图片描述

XPATH的轴的用法:
//div[@id=‘radio’]//label[text()=‘Saab’]/preceding-sibling::input[1], 选择label的text为Saab的节点之前的同级节点中为input节点的第一个,有点绕口,看实例更易明白,从中可以看出,我们可以根据一个radiobox的label来匹配出这个radiobox

用XPATH轴时应该注意的几个问题:
调用轴时,最好用’/’
轴后面要加上符号”::”
“::”后面可以接节点名称,也可以接”*”

轴的另外一种写法
//input[following-sibling::label[1][text()=‘Saab’]], 这个的作用与//div[@id=‘radio’]//label[text()=‘Saab’]/preceding-sibling::input[1]的作用是一样的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值