selenium元素定位

在这里主要介绍xpath的定位方法:

1. //NODE[not(@class)] 所有节点名为node,且不包含class属性的节点

2. //NODE[@class and @id] 所有节点名为node,且同时包含class属性和id属性的节点

3. //NODE[contains(text(),substring] 所有节点名为node,且其文本中包含substring的节点

4、//A[contains(text(),\"下一页\")] 所有包含“下一页”字符串的超链接节点

5、//A[contains(@title,"文章标题")] 所有其title属性中包含“文章标题”字符串的超链接节点

4. //NODE[@id="myid"]/text() 节点名为node,且属性id为myid的节点的所有直接text子节点

5. BOOK[author/degree] 所有包含author节点同时该author节点至少含有一个的degree孩子节点的book节点

6. AUTHOR[.="Matthew Bob"] 所有值为“Matthew Bob”的author节点

7. //*[count(BBB)=2] 所有包含两个BBB孩子节点的节点

8. //*[count(*)=2] 所有包含两个孩子节点的节点

9. //*[name()='BBB'] 所有名字为BBB的节点,等同于//BBB

10. //*[starts-with(name(),'B')] 所有名字开头为字母B的节点

11. //*[contains(name(),'C')] 所有名字中包含字母C的节点

12. //*[string-length(name()) = 3] 名字长度为3个字母的节点

13. //CCC | //BBB 所有CCC节点或BBB节点

14. /child::AAA 等价于/AAA

15. //CCC/descendant::* 所有以CCC为其祖先的节点

16. //DDD/parent::* DDD节点的所有父节点

17. //BBB[position() mod 2 = 0] 偶数位置的BBB节点

18. AUTHOR[not(last-name = "Bob")] 所有不包含元素last-name的值为Bob的节点

19. P/text()[2] 当前上下文节点中的P节点的第二个文本节点

20. ancestor::BOOK[1] 离当前上下文节点最近的book祖先节点

21. //A[text()="next"] 锚文本内容等于next的A节点



备注:css的定位方式可以参考w3c上的教程,有一点值得注意的是,如果使用class定位的时候,class属性的值有空格,比如btn selectOk这种,需要把空格换为.(点)





元素定位的方法:findElement() 与 findElements()

  findElement() 该方法返回基于指定查询条件的webElement对象,或抛出不符合条件的异常  eg:driver.findElement(By.id("userID"));
  findElements() 该方法返回指定查询条件的WebElement的对象集合,或返回null
   3、WebElement对象提供的各种定位元素策略
ID:driver.findElement(By.id(<elementID>))
Name:driver.findElement(By.name(<elementName>))
className:driver.findElement(By.className(<elementClassName>))
tagName:driver.findElement(By.tagName(<htmlTagName>))
linkText:driver.findElement(By.linkText(<linkText>))
partialLinkText:driver.findElement(By.partialLinkText(<partialLinkText>))
css:driver.findElement(By.cssSelector(<cssSelector>))
xpath:driver.findElement(By.xpath(<xpathQuery>))
   4、webelement类提供了诸多方法,在我们开发脚本过程中如何选择最可靠,效率最高的方法,使用id,name是首选,因为他们在html标签中是唯一的,所以是最可靠的
  ID定位:driver.findElement(By.id("username"))
  name定位:driver.findElement(By.name("username"))
  class定位:driver.findElement(By.className("username"))
  多学一招:WebElement类支持查询子类元素,如果页面中存在重复元素,但在不同div中,我们可以先定位到其父元素,然后定位其子元素,方法如下:
  WebElement hello = driver.findElement(By.id("div1")).findElement(By.lindText("hello"));
   5、使用WebElements定位多个相似的元素,比如页面中存在五个单选按钮,他们有相同的class属性,值为:myRadio,我们想对五个按钮循环操作,我们可以把它们全部取出来放到集合中,然后做循环操作,如下:
List<WebElement> radios = driver.findElements(By.className("myRadio"));
for(int i = 0;i<radios.size();i++){
radios.get(i).click();
}
  其他定位方法与操作id,name类似,这里不再赘述,接下来我着重对css选择器与Xpath描述下
   一、WebDriver 的By类中提供了cssSelector()方法,该方法使用有以下几种形式:
   1、使用相对路径定位元素
  如,我们要定为DOM中的input元素,我们可以这样操作,不考虑其在DOM中的位置,但这样做存在一定弊端,当DOM中存在多个input元素时,该方法总返回DOM中的第一个元素,这并不是我们所期待的
  eg:WebElement username = driver.findElement(By.cssSelector("input"));
  另外,为了使用这种方法更准确的定位元素,我们可以结合该元素的其他属性来实现精确定位的目的
  a、结合id来定位,driver.findElement(By.cssSelector("input#username")); 在标签与id之间使用#连接,如果对css了解的朋友一看就知道为什么会这样写了,不了解也没关系,只要记住这种写法就OK了
  另外该方法也可简写为driver.findElement(By.cssSelector("#username")); 有点儿类似于id选择器

b、使用元素的任何属性来定位元素
  driver.findElement(By.cssSelector("标签名[属性名='属性值']"));
   c、匹配部分属性值
^=        driver.findElement(By.cssSelector("标签名[属性名^='xxx']"));  匹配属性值以xxx开头的元素
$=        driver.findElement(By.cssSelector("标签名[属性名$='xxx']"));  匹配属性值以xxx结尾的元素
*=         driver.findElement(By.cssSelector("标签名[属性名^='xxx']"));  匹配属性值包含xxx的元素
   2、使用相对+绝对路径方法,这里是我自己定义的方法,方便记忆,的确也是这样来实现的
  driver.findElement(By.cssSelector("div#login>input"))   该方法中“div#login>input” 首先通过相对路径定位到id为login的div元素,然后查找其子元素input(绝对路径)
   二、使用xpath定位元素,相比cssSelector,xpath是我比较常用的一种定位元素的方式,因为它很方便,缺点是,消耗系统性能
   1、使用绝对路径定位元素
  driver.findElement(By.xpath("/html/body/div/form/input"))
   2、使用相对路径定位元素
  driver.findElement(By.xpath("//input"))   返回查找到的第一个符合条件的元素
   3、使用索引定位元素,索引的初始值为1,注意与数组等区分开
  driver.findElement(By.xpath("//input[2]"))   返回查找到的第二个符合条件的元素
   4、结合属性值来定位元素
  driver.findElement(By.xpath("//input[@id='username']"));
  driver.findElement(By.xpath("//img[@alt='flowr']"));
   5、使用逻辑运算符,结合属性值定位元素,and与or
  driver.findElement(By.xpath("//input[@id='username' and @name='userID']"));
   6、使用属性名来定位元素
  driver.findElement(By.xpath("//input[@button]"))
   7、类似于cssSlector,使用部分属性值匹配元素
starts-with()    driver.findElement(By.xpath("//input[stars-with(@id,'user')]"))
ends-with        driver.findElement(By.xpath("//input[ends-with(@id,'name')]"))
contains()        driver.findElement(By.xpath("//input[contains(@id,"ernam")]"))
   8、使用任意属性值匹配元素
  driver.findElement(By.xpath("//input[@*='username']"))
   9、使用xpath轴来定位元素
  这里略了,详见w3school.com
   三、使用innerText定位元素
   1、使用cssSelector查找innerText定位元素
  driver.findElement(By.cssSelector("span[textContent='新闻']"));
   2、使用xpath的text函数
  driver.findElement(By.xpath("//span[contains(text(),'hello')]"))   包含匹配
  driver.findElement(By.xpath("//span[text()='新闻']"))     绝对匹配


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值