selenium webdriver 元素定位扩展

Webdriver 中有八种常见的定位元素的方法:
1. By.id()
2. By.name()
3. By.tagName()
4. By.className()
5. By.linkText()
6. By.partialLinkText()
7. By.xpath()
8. By.cssSelector()
上面定位元素的方法中,id,linkText,partialLinkText,xpath 一般是得到的单个元素,其余的一般是得到一组元素的 list, 在使用时要注意。

xpath可谓是万金油,基本所有的定位问题都可以用xpath解决。chrome、firefox 等浏览器可以直接复制xpath,但是有些js生成的悬浮框,id 会经常变化,此刻就不能单纯的使用浏览器生成的xpath来定位了,需要自己组织一下,使用xpath语法定位元素。使用xpath定位元素有两种方式:绝对定位和相对定位,一般从浏览器中直接生成的xpath会是绝对定位,但是会从就近的含有id属性的元素生成,例如:

/*[@id='user_portlet']/div[2]/div[1]/div/div/div/a"
/html/body/form[1]
  1. 一般不推荐使用绝对路径的写法,因为一旦页面结构发生变化,该路径也随之失效,必须重新写。
  2. 绝对路径以单/号表示,而下面要讲的相对路径则以//表示,这个区别非常重要。另外需要多说一句的是,当xpath的路径以/开头时,表示让Xpath解析引擎从文档的根节点开始解析。当xpath路径以//开头时,则表示让xpath引擎从文档的任意符合的元素节点开始进行解析。而当/出现在xpath路径中时,则表示寻找父节点的直接子节点,当//出现在xpath路径中时,表示寻找父节点下任意符合条件的子节点,不管嵌套了多少层级(这些下面都有例子,大家可以参照来试验)。弄清这个原则,就可以理解其实xpath的路径可以绝对路径和相对路径混合在一起来进行表示,想怎么玩就怎么玩。

下面是相对路径的引用写法:
查找页面根元素://
查找页面上所有的input元素://input

查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号)://form[1]/input

查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号)://form[1]//input

查找页面上第一个form元素内的最后一个input元素://form[1]//input[last()](注意:在xpath中没有first()这样的方法,用//form[1]//input[1]这种表示法就可以取第一个)

查找页面上第一个form元素://form[1]

查找页面上id为loginForm的form元素://form[@id=’loginForm’]

查找页面上具有name属性为username的input元素://input[@name=’username’]

查找页面上id为loginForm的form元素下的第一个input元素://form[@id=’loginForm’]/input[1](注意:在xpath中没有第0元素这样的表示方法,都是从1开始)

查找页面具有name属性为contiune并且type属性为button的input元素://input[@name=’continue’][@type=’button’]

查找页面上id为loginForm的form元素下第4个input元素://form[@id=’loginForm’]/input[4]

Xpath功能很强大,所以也可以写得更加复杂一些,如下面图的HTML源码
这里写图片描述

如果我们现在要引用id为“J_password”的input元素,该怎么写呢?我们可以像下面这样写:

WebElement password = driver.findElement(By.xpath("//*[@id='J_login_form']/dl/dt/input[@id='J_password']"));  
WebElement password =driver.findElement(By.xpath("//*[@id='J_login_form']/*/*/input[@id='J_password']"));  

这里解释一下,其中//[@id=’J_login_form’]这一段是指在根元素下查找任意id为J_login_form的元素,此时相当于引用到了form元素。后面的路径必须按照源码的层级依次往下写。因为我们要找的input元素包含在一个dt标签内,而dt又包含在dl标签内,所以中间必须写上dl和dt两层,才到input这层。当然我们也可以用号省略具体的标签名称,但元素的层级关系必须体现出来,比如我们不能写成

//*[@id='J_login_form']/input[@id='J_password'],

这样肯定会报错的。

前面讲的都是xpath中基于准确元素属性的定位,其实xpath作为定位神器也可以用于模糊匹配。比如下面图所示代码:
这里写图片描述

这段代码中的“退出”这个超链接,没有标准id元素,只有一个rel和href,不是很好定位。不妨我们就用xpath的几种模糊匹配模式来定位它吧,主要有三种方式,举例如下。
a. 用contains关键字,定位代码如下:

driver.findElement(By.xpath(“//a[contains(@href,‘logout’)]”));  

这句话的意思是寻找页面中href属性值包含有logout这个单词的所有a元素,由于这个退出按钮的href属性里肯定会包含logout,所以这种方式是可行的,也会经常用到。其中@后面可以跟该元素任意的属性名。

b. 用start-with,定位代码如下:

driver.findElement(By.xpath(“//a[starts-with(@rel, ‘nofo’)]));  

这句的意思是寻找rel属性以nofo开头的a元素。其中@后面的rel可以替换成元素的任意其他属性。

c. 用Text关键字,定位代码如下:

driver.findElement(By.xpath(“//*[text()=’退出’]));  

这个方法可谓相当霸气啊。直接查找页面当中所有的退出二字,根本就不用知道它是个a元素了。这种方法也经常用于纯文字的查找。
另外,如果知道超链接元素的文本内容,也可以用

driver.findElement(By.xpath(“//a[contains(text(), ’退出’)]));   

这种方式一般用于知道超链接上显示的部分或全部文本信息时,可以使用。

最后,关于xpath这种定位方式,webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素,所以这是一个非常费时的操作,如果你的脚本中大量使用xpath做元素定位的话,将导致你的脚本执行速度大大降低,所以请慎用。

文章转自:http://blog.csdn.net/qingchunjun/article/details/42581261#

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值