Webdriver元素定位方法

WebDriver 提供了八种元素定位方法:
 id
 name
 class name
 tag name
 link text
 partial link text
 xpath

 css selector

在Java 语言中对应的定位方法如下:

findElement(By.id())
findElement(By.name())
findElement(By.className())
findElement(By.tagName())
findElement(By.linkText())
findElement(By.partialLinkText())
findElement(By.xpath())
findElement(By.cssSelector())


id 定位

对百度首页上的输入框与百度搜索按钮来说,定位方法如下:
findElement(By.id("kw"))
findElement(By.id("su"))
findElement(By.id())方法用于元素中id 属性的定位。

name 定位

name 的定位与id 类似,每一个人都会有名字,那么name 就可作是一个元素的名字。通过name 定位
输入框:
findElement(By.name("wd"))
findElement(By.name())方法用于元素中name 属性的定位,百度搜索按钮并没有提供name 属性,那么
我们就不能通过name 去定位百度搜索按钮

class 定位

class 也是不少元素会有的一个属性,它的定位和name 以及id 类似,下面通过class 去定位百度输入
狂和百度搜索按钮:
findElement(By.className("s_ipt"))
findElement(By.className("bg s_btn"))
findElement(By.className())方法用于元素中class 属性的定位。

tag 定位

tag 定位取的是一个元素的标签名,通过标签名去定位单个元素的唯一性最底,因为在一个页面中有
太多的元素标签为<div>和<input>了,所以很难通过标签名去区分不同的元素。
通过标签名定位百度首页上的输入框与百度搜索按钮:
findElement(By.tagName("input"))
findElement(By.tagName("input"))
findElement(By.tagName())方法通过元素的tag name 来定位元素。通过上面的例子,我们并不能区别
不同的元素,因为在一个页面上标签名相同很难以避免。

link 定位

link 定位与前面介绍的几种定位方法有所不同,它专门用来定位本链接。百度输入框上面的几个文本
链接的代码如下:

<a class="mnav" name="tj_trnews" href="http://news.baidu.com">新闻</a>
<a class="mnav" name="tj_trhao123" href="http://www.hao123.com">hao123</a>
<a class="mnav" name="tj_trmap" href="http://map.baidu.com">地图</a>
<a class="mnav" name="tj_trvideo" href="http://v.baidu.com">视频</a>
<a class="mnav" name="tj_trtieba" href="http://tieba.baidu.com">贴吧>
通过查看上面的代码,我们发现通过name 属性定位是个不错的选择。不过我们这里为了要学习link
定位,通过link 定位实现如下:
findElement(By.linkText("新闻"))
findElement(By.linkText("hao123"))
findElement(By.linkText("地图"))
findElement(By.linkText("视频"))
findElement(By.linkText("贴吧"))
findElement(By.linkTame())方法通过元素标签对之间的文本信息来定位元素。


partial link 定位

parial link 定位是对link 定们的一个种补充,有些文本连接会比较长,这个时候我们可以取文本链接的
有一部分定位,只要这一部分信息可以唯一的标识这个链接。

<a class="mnav" name="tj_lang" href="#">一个很长很长的文本链接</a>
通过partial link 定位如下:
findElement(By.partialLinkText("一个很长的"))
findElement(By.partialLinkText("文本链接"))
findElement(By.partialLinkText())方法通过元素标签对之间的部分文本信息来定位元素。

XPath 定位

参考baidu.html 前端工具所展示的代码,我们可以用下面的方式来找到百度输入框和搜索按钮。
findElement(By.xpath("/html/body/div/div[2]/div/div/div/from/span/input"))
findElement(By.xpath("/html/body/div/div[2]/div/div/div/from/span[2]/input"))
findElement(By.Xpath())方法用于XPath 语言定位元素。XPath 的绝对路径主要用标签名的层级关系来
定位元素的绝对路径。最外层为html 语言,body 文本内,一级一级往下查找,如果一个层级下有多个相
同的标签名,那么就按上下顺序确定是第几个,div[2]表示第二个div 标签。

利用元素属性定位:
除了使用绝对路径的以外,XPath 也可以使用使素的属性值来定位。同样以百度输入框和搜索按钮为
例了:
findElement(By.xpath("//input[@id='kw']"))
findElement(By.xpath("//input[@id='su']"))

//表示当前页面某个目录下,input 表示定位元素的标签名,[@id='kw'] 表示这个元素的id 属性值等于
kw。下面通过name 和class 属性值来定位。

findElement(By.xpath("//input[@name='wd']"))
findElement(By.xpath("//input[@class='s_ipt']"))
findElement(By.xpath("//*[@class='bg s_btn']"))
如果不想指定标签名也可以用星号(*)代替。当然,使用XPath 不仅仅只局限在id、name 和class 这
三个属性值,元素的任意属性值都可以使用,只要它能唯一的标识一个元素。
findElement(By.xpath("//input[@maxlength='100']"))
findElement(By.xpath("//input[@autocomplete='off']"))
findElement(By.xpath("//input[@type='submit']"))


层级与属性结合:
如果一个元素本身并没有可以唯一标识这个元素的属性值,我们可以找其上一级元素,如果它的上级
有可以唯一标识属性的值,也可以拿来使用

findElement(By.xpath("//span[@class='bg s_ipt_wr']/input"))
span[@class='bg s_ipt_wr'] 通过class 属性定位到是父元素,后面/input 也就表示父元素下面标签名为
input 的子元素。如果父元素没有可利用的属性值,那么可以继续向上查找“爷爷”元素。
findElement(By.xpath("//form[@id='form']/span/input"))
findElement(By.xpath("//form[@id='form']/span[2]/input"))
我们可以通过这种方法一级一级的向上打找,直到找到最外层的<html>标签,那么就是一个绝对路径
的写法了

使用逻辑运算符

findElement(By.xpath("//input[@id='kw' and @class='su']/span/input"))
当然,我们也可以用and 连接更多的属性来唯一的标识一个元素。

CSS 定位

通过class 属性定位:
findElement(By.cssSelector(".s_ipt"))
findElement(By.cssSelector(".bg s_btn"))
findElement(By.cssSelector())方法用于CSS 语言定位元素,点号(.)表示通过class 属性来定位元素。
通过id 属性定位:
findElement(By.cssSelector("#kw"))
findElement(By.cssSelector("#su"))

井号(#)表示通过id 属性来定位元素

通过父子关系定位:
findElement(By.cssSelector("span > input"))
上面的写法表示有父亲元素,它的标签名叫span,查找它的所有标签名叫input 的子元素

通过属性定位:
findElement(By.cssSelector("input[autocomplete='off']"))
findElement(By.cssSelector("input[maxlength='100']"))
findElement(By.cssSelector("input[type='submit']"))
在CSS 当中也可以使用元素的任意属性,只要这些属性可以唯一的标识这个元素

组合定位:
我们当然可以把上面的定位策略组合起来使用,这样就大大加强了元素的唯一性。
findElement(By.cssSelector("xpan.bg s_ipt_wr > input.s_ipt"))
findElement(By.cssSelector("xpan.bg s_ipt_wr > input#su"))
有一个父元素,它的标签名叫span,它有一个class 属性值叫bg s_ipt_wr,它有一个子元素,标签名
叫input,并且这个子元素的class 属性值叫s_ipt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值