xpath 学习笔记

1. xpath是什么

XPATH是一门在XML文档中查找信息的语言,XPATH可用来在XML文档中对元素和属性进行遍历,主流的浏览器都支持XPATH,因为HTML页面在DOM中表示为XHTML文档。XPATH语言是基于XML文档的树结构,并提供了浏览树的能力,通过多样的标准来选择节点。

Selenium WebDriver支持使用XPATH表达式来定位元素。

XPATH和CSS选择器最重要的区别是XPATH可以向前和向后查询DOM结构的元素,而CSS选择器只能向前查询,这意味着XPATH可以通过子元素来定位父元素!

2. xpath的几种定位方法

1). 绝对路径(当页面元素位置发生改变时,都需要修改,因此,并不推荐使用)

       例:xpath = /html/body/div[x]/form/input

2). 相对路径

   例如,百度首页新闻的xpath =  //*[@id="u1"]/a[1]  : id 值为u1的div下面第一个a标签

3). contains函数定位,也叫模糊定位

有时候xpath表达式太长或者节点信息里面,有些信息是动态的,每次都获取都不一样,这个时候contains()方法就很好用

例如美团首页搜索商家输入框,如果用chrome开发者工具的copy xpath拷贝下来的xpath为://*[@id="main"]/header/div[2]/div[2]/div[1]/input定位也是没有问题,但是太长了,现在我们来修改一下为://*/input[contains(@class,'header-search-input')] 看起来就相对简单了很多

再如美团首页的“美食”,同样xpath虽然定位也没有问题但是相当长:

//*[@id="app"]/div/div/div[1]/div[1]/div/div[2]/ul/li[1]/span/span/a

但是如果我们用contains函数的话就会变得很简单://*/span/a[contains(@href,'meishi')]

注:如果xpath直接写成//*/a[contains(@href,'meishi')]执行的时候会报错

“ElementNotVisibleException: Message: element not visible”

在这种情况下需要加上父节点/span

4). 通过xpath轴来定位

当某个元素的各个属性及其组合都不足以定位时,我们可以利用其兄弟节点或者父节点等各种可以定位的元素进行定位

美团登录页面有手机动态码登录和账号登录,由两个form通过sytle=display:block 和style=display:none来显示和隐藏,在每个form下面都有一个7天内自动登录,如果直接取7天内自动登录label都xpath是://*[@id="J-normal-form"]/div[5]/label 是可以定位成功的,但是我们也可以尝试用轴来定位,例如:

a.通过找form的孩子里面第5个div中的label来进行定位

//*[@id="J-normal-form"]/child::div[5]/label[@for="autologin"]

b.通过following-sibling (选取当前节点之后的所有兄弟节点)来进行定位

选取/a标签之后的兄弟节点label来定位

//*/a[contains(@href,'retrievepassword')]/following-sibling::label[@for="autologin"]

注:有时候我们会觉得需要取的元素为label前的这个type=checkbox的元素,进行操作才能选中checkbox,但是在某些情况下这个type=checkbox元素是隐藏的元素,不管用什么方法取xpath进行操作都会报错提示“ElementNotVisibleException: Message: element not visible”,此时我们可以思考一下,尝试去操作input后面的label,因为其实他们是一体的。

5). 通过元素属性来进行定位

定位美团登录页面账号输入框,我们可以通过元素属性来进行定位,当id能唯一标志这个元素的时候可以用以下xpath

//*[@id="login-email"]

但是如果id不能唯一区别这个输入框元素的时候可以加入其他属性,如下:

//*[@id="login-email" and @name="email"]

6).通过文本值进行定位

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

例如美团首页的"手机APP"可以通过如下xpath进行定位

//*/a[contains(text(),'手机APP')]

7). 通过starts-with, ends-with 方法来进行定位

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

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

8). 找上级

找爸爸:xpath = //span[@class=’bg s_ipt_w’]/input

如果爸爸没有唯一的属性,可以找爷爷:xpath = //form[@id=’form1’]/span/input

这样一级一级找上去,直到html ,那么就是一个绝对路径了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,180评论 19 139
  • 使用selenium进行自动化时少不了对元素进行定位,但目前前端大多使用框架vue,angular等,很多元素并没...
    菠了个萝阅读 9,765评论 1 5
  • 以前只会用Beautiful Soup, 后来听说xpath速度更快而且更好用, 那还用说吗?赶紧弃暗投明了. 导...
    mundane阅读 279评论 0 0
  • 我翻开有你照片的相册,而你在我的心田。我来到有你走过的麦田,而你已心往海边!
    山中客服阅读 143评论 0 0
  • 1.参数解释: weight=设置服务器的权重值max_fails=检测失败的次数fail_timeout=检测的...
    古寒飞阅读 217评论 0 0