更通俗的理解
经过验证id、name,xpath、css四种定位方式是可以的,尤其后两种是“万能的”,所以可以解决99%的定位问题。
id 和 name 定位:
假如把一个元素看作一个人的话,id?和name可以看作一个人的身份证号和姓名。当然,这些属性值是否唯一要看前端工程师如何设计了
根据上面的例子,百度输入框可以取id 和name 进行定位。(前提是id 和name 的值在当前页面上是唯一的)
id=kw
name=wd
xpath定位:
假如,一个人没身份证号没名字怎么找呢?想想你是怎么找朋友吃饭的,他手机不通,电话不回呢?直接上他家去呗,那你一定有他家住址,xx市xx区xx路xx号。Xpath就可以通过这种层级关系找到元素。
百度输入框在整个页面上的位置:
1.Xpath的绝对路径:
/html/body/div[3]/div[1]/div[1]/div[1]/div[1]/form/span[1]/input
我们可以从最外层开始找,html下面的body 下面的第三个div下面的…input 标签.通过一级一级的锁定就找到了想要的元素。
2.Xpath 的相对路径:
绝对路径的用法往往是在我们迫不得已的时候才用的。大多时候相对路径更简便。
2.1.元素本身:
Xpath 同样可以利用元素自身的属性: Xpath=//*[@id=’kw’] //表示某个层级下,*表示某个标签名。@id=kw 表示这个元素有个id等于kw。 当然也可以指定标签名: Xpath=//input[@id=’kw’] 元素本身可以利用的属性就不只局限于id 和name,如: Xpath= //input[@name='wd'] Xpath= //input[@class='s_ipt'] Xpath= //input[@autocomplete='off'] 但要保证这些元素可以唯一识别一个元素。
找上级:
当我们要找的一个人是个刚出生的婴儿,还没起名子也没有入户口(身份证号),但是你会永远跟在你父亲的身边,你的父亲是有唯一的名字和身份证号的,这样我们可以先找到你父亲,自然就找到你的。
元素的上级属性为:
找父节点:
Xpath= //span[@class='bg s_ipt_wr quickdelete-wrap']/input 如果父节点没有唯一的属性,可以找祖父节点: Xpath= //form[@id='form']/span[1]/input
这样一级一级的找上去,知道html,那就是一个绝对路径了。
布尔值写法:
如果一个人的姓名不是唯一的,身份证号也不是唯一的,但是同时叫张三?并且?身份证号为123?的人却可以唯一的确定一个人。那么可以这样写:
Xpath=//input[@name='wd' and @id='kw'] 可以and,当然也可以or: Xpath=//input[@name='wd' or @id='kw']
Xpath 学习地址:http://www.w3school.com.cn/xpath/index.asp
Xpath选取节点:
表达式 | 描述 |
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
谓语:
谓语用来查找某个特定的节点或者包含某个指定的值得节点。
谓语被嵌在方括号中。
路径表达式 | 结果 |
//table//tr[1] | 选取属于 table子元素的第一个 tr 元素。 |
//table//tr[last()] | 选取属于 table 子元素的最后一个tr 元素。 |
//table//tr[last()-1] | 选取属于table 子元素的倒数第二个 tr元素。 |
//table//tr[position()<3] | 选取最前面的两个属于table 元素的子元素的 tr元素。 |
//input[@id] | 选取所有拥有名为id 的属性的 input 元素。 |
//input[@id='kw'] | 选取所有 input 元素,且这些元素拥有值为 kw 的 id 属性。 |
选取未知节点:
//* 选取文档中的所有元素 //table /* 选取table 元素的所有子元素 //input[@*] 选取所有带有属性的title元素
Xpath 轴:
轴名称 | 结果 |
ancestor | 选取当前节点的所有先辈(父、祖父等)。 |
ancestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。 |
child | 选取当前节点的所有子元素。 |
descendant | 选取当前节点的所有后代元素(子、孙等)。 |
descendant-or-self | 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。 |
following | 选取文档中当前节点的结束标签之后的所有节点。 |
parent | 选取当前节点的父节点。 |
preceding | 选取文档中当前节点的开始标签之前的所有节点。 |
preceding-sibling | 选取当前节点之前的所有同级节点。 |
//table[@class='tab']//child::tr Xpath 常用函数: text()://a[span[text()='应用项目查询']] contains()://a[span[contains(text(),'应用项目查询')]] normalize-space()://table[@class='tab']//tr[2]/td[normalize-space()='第三方验证']
删除当前节点字符串的开头和结尾的空白,并把内部的所有空白序列替换为一个
作者:HuiTest
原文链接:https://blog.csdn.net/qq_43422918/article/details/98481852