Selenium自动化测试-Xpath定位详解(七)

Xpath是什么鬼?我们先来百度一下,然后就知道了xpath:XPath 是一门在 XML 文档中查找信息的语言,是 XSLT 中的主要元素。知道这么多就可以了,那XML又是什么?XML 指可扩展标记语言,用来存储和传输数据滴。又因为页面的html长的很像xml,所以呢,xpath也可以用来查找html文档。下面来介绍下selenium常用到的xpath使用方法,还是以百度为例

 

第一种,以元素的属性查找,比如id,name,class等,可以看到属性的表示语法格式为:[@属性名称=属性值],但是有个要注意,元素的文本属性的语法格式是:[text()=‘文本内容’]

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#查找元素属性id=kw的元素
input_el = driver.find_element_by_xpath("//*[@id='kw']")
#查找元素属性name=wd的元素
input_el = driver.find_element_by_xpath("//*[@name='wd']")
#查找元素属性class=s_ipt的元素
input_el = driver.find_element_by_xpath("//*[@class='s_ipt']")
#查找元素属性type=text的元素
input_el = driver.find_element_by_xpath("//*[@type='text']")

第二种,元素标签名称,搭配上元素的属性

#查找元素标签为input且属性id=kw的元素
input_el = driver.find_element_by_xpath("//input[@id='kw']")
#查找元素标签为input且name=wd的元素
input_el = driver.find_element_by_xpath("//input[@name='wd']")
#查查找元素标签为input且class=s_ipt的元素
input_el = driver.find_element_by_xpath("//input[@class='s_ipt']")
#查找元素标签为input且type=text的元素
input_el = driver.find_element_by_xpath("//input[@type='text']")

第三种,带层级的查找方法,有时候单个元素属性在文档中有重复,或者定位不明显,可以考虑先从它的长辈开始定位,就好比一个班上,有好几个同学都叫小明,有时候老师点名,直接叫小明,那么好多个小明都会站起来,那怎么区分了?聪明的老师想到了一个办法,点名的时候先说明同学的爸爸叫什么名字,然后再说小明:小明且他的爸爸叫大明的同学,这样大家都知道叫谁了,假如班里恰好同学名字相同,且他爸爸的名字也相同的情况,那么杂搞,还是一样的,带上他的爷爷,这样总不会重复了吧;在xpath的层级定位中也是一样的,格式如下:爷爷辈/父辈/本人,即用/来表示层级

#查找层级关系为form->span->元素标签为input且属性id=kw的元素
input_el = driver.find_element_by_xpath("//form[@id='form']/span/input[@id='kw']")
#查找层级关系为form->span->标签为input且name=wd的元素
input_el = driver.find_element_by_xpath("//form[@id='form']/span/input[@name='wd']")
#查找层级关系为form->span->标签为input且class=s_ipt的元素
input_el = driver.find_element_by_xpath("//form[@id='form']/span/input[@class='s_ipt']")
#查找层级关系为form->span->标签为input且type=text的元素
input_el = driver.find_element_by_xpath("//form[@id='form']/span/input[@type='text']")

第四种,同级索引定位,对于相同层级中,元素的标签,属性都相同的,杂定位?就好比生活中的双胞胎,长的一模一样,名字也取的一样(坑爹),那么怎么区分呢?先定位它们的爸爸,然后再说明是老大,还是老二(双胞胎也是有先后的),xpath也是一样的道理,对于同级的顺序,我们用[索引]来表示,注意是从1开始,此处程序员表示蛋疼,数数不都是从0开始的吗?

#查找form标签且id=form下的第三个input
input_el = driver.find_element_by_xpath("//form[@id=form]/input[3]")

第五种,逻辑运算定位,元素有多种属性,可以用逻辑运算来表示,可以支持与(and)、或(or)、非(not)

#查找Input标签且id=kw并且name=wd的元素
input_el = driver.find_element_by_xpath("//input[@id='kw' and @name='wd']")

第六种,模糊匹配元素属性

#查找元素属性的id值包含k的元素
input_el = driver.find_element_by_xpath("//*[contains(@id,'k')]")
#查找元素属性的id值以k开头的元素
input_el = driver.find_element_by_xpath("//*[starts-with(@id,'k')]")
#查找a元素的text值包含高考加油的元素
input_el = driver.find_element_by_xpath("//a[contains(text(),'高考加油')]")

学了这么多的方法,还是比较懵逼,为啥语法格式是这样的呢,其实只要会用就行了,但是如果要想更深入的了解这些语法,还有很多的知识点要了解,请参考:菜鸟教程-xpath

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值