一、webdriver提供的八种定位方法
- id
- name
- class name
- tag name
- link text
- partial link text
- xpath
- css selector
二、方法使用-java
以百度首页代码为例:
……
<input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd">
……
<input id="su" class="bg s_btn" type="submit" value="百度一下">
……
<a class="mnav" name="tj_trnews" href="http://news.baidu.com">新闻</a>
id:
findElement(By.id());---driver.findElement(By.id("kw"));
通过元素的id属性来查找元素,具有很强的唯一性。
name:
findElement(By.name());---driver.findElement(By.name("wd"));
通过元素的name属性来查找元素,在当前页面中可以不唯一。
className:
findElement(By.className());---driver.findElement(By.className("s_ipt"));
通过元素的class属性查找元素。
tagName:
findElement(By.tagName());---dirver.findElement(By.tagName("input"));
通过元素的标签名(tagname)来查找元素,但是识别元素的概率很低。
linkText:
findElement(By.linkText());---driver.findElement(By.linkText("新闻"));
link用来定位文本链接。
partialLinkText:
findElement(By.partialLinkText());---driver.findElement(By.partialLinkText("新"));
partial link是对link定位的一种补充,在文本链接比较长的时候,可以使用该方法截取一部分文本进行定位。
xpath:
findElement(By.xpath());---driver.findElement(By.xpath("//input[@id='kw']"));
xpath有多种定位策略,最简单直观的是写出元素的绝对路径。还可以使用元素的属性、元素属性与层级以及逻辑运算符来进行定位。
findElement(By.xpath(".//*[@id='kw'and@name='wd']"));
下面是对xpath轴的简单介绍(下面使用方法中默认使用xpath):
child---选取当前节点的所有子元素
child是xpath默认的轴,可以省略不写。使用方法:/child::A等价于/A。
parent---选取当前节点的所有父节点
parent轴是选取当前节点的父节点。使用方法:/A/parent::*获取所有节点A的父节点。
descendant---选取当前节点的所有后代元素(子、孙、等)
descendant选取当前节点的所有后代元素(包括子节点、子孙节点…),descendant (后代)轴包含上下文节点的后代,一个后代是指子节点或者子节点的子节点等等。使用方法:/A/descendant::*获取节点A的所有后代元素;/A/descendant::B获取所有以节点A为祖先的B元素。
ancestor---选取当前节点的所有先辈(父、祖父等)
ancestor轴(axis)包含上下节点的祖先节点, 该祖先节点由其上下文节点的父节点以及父节点的父节点等等诸如此类的节点构成,所以ancestor轴总是包含有根节点,除非上下文节点就是根节点本身.使用方法:/A/ancestor::*选取元素A的所有祖先节点
descendant-or-self---选取当前节点的所有后代元素(子、孙等)以及当前节点本身
与descendant类似,只是多了节点本身。
ancestor-or-self---选取当前节点的所有先辈(父、祖父等)以及当前节点本身
与ancestor类似,只是多了节点本身。
preceding-sibling---选取当前节点之前的所有同级节点
选取当前节点之前的所有的同一parent下的节点。使用方法:/A/preceding-sibling::*选取所有A节点的同级哥哥节点。
following-sibling---选取当前节点之后的所有同级节点
选取当前节点之后的所有同级同父的节点。使用方法:/A/followin-sibling::*选取A节点之后的所有同级节点。
preceding---选取文档中当前节点的开始标签之前的所有节点
preceding选取文档中当前节点的开始标签之前的所有节点,包含同一文档中按文档顺序位于上下文节点之前的所有节点,除了祖先节点。与preceding-sibling的区别是preceding-sibling只选取同级节点。使用方法:/A/preceding::*选取A节点的所有之前节点。
following---选取文档中当前节点的结束标签之后的所有节点
following选取文档中当前节点的结束标签之后的所有节点,包含同一文档中按文档顺序位于上下文节点之前的所有节点,除了祖先节点。 following是向后选取,preceding是向前选取。与following-sibling的区别是following-sibling只选取同级节点。使用方法:/A/following::*选取A节点的所有之后节点。
self---选取当前节点
self选取当前节点,一般与其他轴一起使用,例如ancestor-or-self。使用方法:/A/self::*选取节点A。
attribute---选取当前节点的所有属性
attribute选取当前节点的所有属性,获取的结果是属性而不是节点,其他轴是选取节点。使用方法:/A/attribute::*选取A节点的所有属性。
namespace---选取当前节点的所有命名空间节点
namespace用来选取名称空间节点,每个元素节点都有一个专门名称空间节点表示每个作用域名称空间。该项使用频率很小。
cssSelector:
css选择器的常见语法表如下所示,使用方法:findElement(By.cssSelector());
通过class属性定位,点号(.)表示通过class属性来定位元素:
findElement(By.cssSelector(".s_ipt"));获取class属性为.s_ipt的元素
通过id属性定位,井号(#)表示通过id属性来定位元素:
findElemen(By.cssSelector("#kw"));获取id为kw的元素
通过标签名定位,直接使用标签名即可:
findElement(By.cssSelector("input"));获取所有标签名为input的元素
通过父子关系定位:
findElement(By.cssSelector("span>input"));获取父节点为span的所有input子节点
通过属性定位,可使用元素的任意可唯一标识元素的属性,属性值的引号可加可不加,但须与整个字符串的引号进行区分:
findElement(By.cssSelector("input[type='submit']"));获取type属性值为submit的input元素
组合定位,input#kw等同于input[id=kw],input.s_ipt等同于input[class=s_ipt]:
findElement(By.cssSelector("form#form>span>input.s_ipt"));
xpath与css的类似功能简单对比如下表所示:
可根据喜好选择一种进行精进学习。