python selenium xpath定位方式

作者刚开始写博客,格式和语言方面难免存在问题,请大家海涵,如果有问题也请直接指出


xpath是一种在xm文档中定位的语言,详细简介,请自行参照百度百科,本文主要总结一下xpath的使用方法,个人看法,如有不足和错误,敬请指出。

注意:xpath的定位 同一级别的多个标签 索引从1开始 而不是0

1. 绝对定位:

   此方法最为简单,具体格式为

          xxx.find_element_by_xpath("绝对路径")

    具体例子:

         xxx.find_element_by_xpath("/html/body/div[x]/form/input") x 代表第x div标签,注意,索引从1开始而不是0

        此方法缺点显而易见,当页面元素位置发生改变时,都需要修改,因此,并不推荐使用。

2.相对路径:

相对路径,以‘//’开头,具体格式为

 xxx.find_element_by_xpath("//标签")

具体例子:

xxx.find_element_by_xpath("//input[x]") 定位第xinput标签,[x]可以省略,默认为第一个

  相对路径的长度和开始位置并不受限制,也可以采取以下方法

xxx.find_element_by_xpath("//div[x]/form[x]/input[x]"), [x]依然是可以省略的

 

("//*[@id='J_login_form']/dl/dt/input[@id='J_password']"

3.标签属性定位:

           3.1标签属性定位,相对比较简单,也要求属性能够定位到唯一一个元素,如果存在多个相同条件的标签,默认只是第一个,具体格式

      xxx.find_element_by_xpath("//标签[@属性==‘属性值’]")

属性判断条件:最常见为idnameclass等等,目前属性的类别没有特殊限制,只要能够唯一标识一个元素都是可以的

具体例子

       xxx.find_element_by_xpath("//a[@href='/industryMall/hall/industryIndex.ht']")
       xxx.find_element_by_xpath("//input[@value='确定']")
       xxx.find_element_by_xpath("//div[@class = 'submit']/input")

          当某个属性不足以唯一区别某一个元素时,也可以采取多个条件组合的方式,具体例子

        xxx..find_element_by_xpath("//input[@type='name' and @name='kw1']")

 

       3.2 当标签属性很少,不足以唯一区别元素时,但是标签中间中间存在唯一的文本值,也可以定位,其具体格式

       xxx.find_element_by_xpath("//标签[contains(text(),'文本值')]") 

   

     具体例子:

 

        xxx.find_element_by_xpath("//iunpt[contains(text(),'型号:')]")  

       注意:尽量在html中复制此段文本,避免因为肉眼无法分辨的字符导致定位失败

      

      3.3 其他的属性值如果太长,也可以采取模糊方法定位,直接上示例

    

       xxx.find_element_by_xpath(“//a[contains(@href, ‘logout’)]”)

 

  3.4 XPath 关于网页中的动态属性的定位,例如,ASP.NET应用程序中动态生成id属性值,可以有以下四种方法:

      a.starts-with      例子: input[starts-with(@id,'ctrl')]              解析:匹配以ctrl开始的属性值

      b.ends-with        例子:input[ends-with(@id,'_userName')]     解析:匹配以userName结尾的属性值

      c.contains()        例子:Input[contains(@id,'userName')]        解析:匹配含有userName属性值

 

当然,如果上面的单一方法不能完成定位,也可以采取组合式定位 类似("//input[@id='kw1']//input[start-with(@id,'nice']/div[1]/form[3])

 

 

 

以上是普通的情况,存在可以定位的属性,当某个元素的各个属性及其组合都不足以定位时,我们可以利用其兄弟节点或者父节点等各种可以定位的元素进行定位,先看看xpath中支持的方法

     1child  选取当前节点的所有子元素

     2parent  选取当前节点的父节点

     3descendant选取当前节点的所有后代元素(子、孙等

     4ancestor  选取当前节点的所有先辈(父、祖父等

     5descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身

     6ancestor-or-self  选取当前节点的所有先辈(父、祖父等)以及当前节点本身

     7preceding-sibling选取当前节点之前的所有同级节点

     8following-sibling选取当前节点之后的所有同级节点

     9preceding   选取文档中当前节点的开始标签之前的所有节点

    10following   选取文档中当前节点的结束标签之后的所有节点

    11self  选取当前节点

    12attribute  选取当前节点的所有属性

    13namespace选取当前节点的所有命名空间节点

 

 

上图实例,需要点击订单号为17051915200001的发货按钮,这时候不能直接定位到发货按钮,而是先要定位到订单号元素,再定位他的兄弟节点。参照上图,我们首先定位到td标签中包含订单号的td元素,然后选择其之后的同级节点,following-sibling,我们要找的元素在后面的第8td标签下,因此定位可以写名为下面的格式

Xxx.find_element_by_xpath("//td[contains(text(),’17051915200001’)]/following-sibling::td[8]/a[@class='link']")

 

preceding-sibling  情况类似,但是所有元素的排列顺序是相反的(和following-sibling相反),如图:

其他方法的使用方式相同, 11-13目前没有使用过,也没有搜索到实际使用的案例,如果有人知道,希望不吝赐教。

  • 37
    点赞
  • 185
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值