-------------------------------------------------xpath元素定位---------------------------------
xpath其实就是一个path(路径),一个描述页面元素位置信息的路径,相当于元素的坐标
xpath基于xml文档树状结构,是xml路径语言,用来查询xml文档中的节点
xpath绝对定位
从根开始找../(根目录)
前程贷登陆界面:
/html/body/div[2]/div
form
div[5]/button
绝对路径以单/斜杠表示,而且是让解析引擎从文档的根节点开始解析,也就是html这个节点开始解析
路径解析:html-->body-->第二个div-->div-->...
例如:
使用绝对路径定位百度首页的input输入框
html/body/div[2]/div[2]/div[5]/div/div/form/span/input
注意:
1 要一层一层节点数下去---类似文件夹找子文件夹,一级一级找下去
2 div[2]-----索引从1开始,不是从0开始
3 div[2]/div[2]-----第二个div节点下面的第二个div
4 从根节点(html)开始找
5 /div[5]/div/div------div不加索引下标,默认找到的是第一个div
6 绝对路径了解即可,一般不用
缺点:
1 不太稳定-----页面一但修改,可能导致绝对路径失效
一但页面结构发生变化,(比如重新设计,路径少了两个节点),该路径也随之失效,必须重写
xpath 相对定位
只要不是单斜杠/开始的,就是相对路径
登录手机号:
//*[@name='phone']
相对路径则以//双斜杠表示,则表示让xpath引擎从文档的任意符合的元素节点开始进行解析
路径解释:
// 匹配指定节点,不考虑它们位置(/则表示绝对路径,从根下开始)
- 通配符,匹配任意元素节点
@ 选取 属性
[] 属性判断条件表达式
相对定位优点:灵活,方便,耦合性
案例:http://120.78.128.25:8765/index/login.html
通过元素名定位
//input 获取页面所有input元素
---------------------------------------------以百度首页为例--------------------------------------------
1 定位 百度一下按钮的左侧input框
1.如果不知道你要定位的标签名,可以使用 * 通配符,匹配所有节点
//*[@id="kw"];在所有标签中定位id=kw的标签,只要id=k唯一,就可以定位到
2.如果属性=属性值,不是唯一的,最好指定要定位的标签
//input[@id="kw"];//先找到input标签,在所有input标签中找到id=kw,即可定位到元素
3.多个属性表达式如何写?
//input[@id="kw " or @maxlength="100"];// or 满足一个条件即可
//input[@autocomplete="off" and @maxlength="100" ];// and 两个条件同时满足
-------------------------------------------------xpath常见元素定位方式-------------------------------------
(1) 元素文本值 ---text()="文本值"
//a[text()="新闻"];// 这里是全文本
(2)元素部分文本值---contains(text(),"部分文本值")
//a[contains(text(),"闻")];// a标签的文本值只要包含闻 即可
(3)元素属性的部分属性值----contains(@class, "class属性的部分属性值")
//input[contains(@class, "s_ipt")]; //input标签class属性值有2个 s_ipt nobg_s_fm_hover,通过部分属性值如果可以定位到,就可以使用部分属性值定位
(4)父元素找子元素
//li[@class="li3"]/a;//找到父节点li,再找到子节点a
//strong/a;//找到父元素strong,再找到子元素a
-------------------------------xpath高级用法:轴定位-------------------------------------------
xpath轴定位
当某个元素的各个属性及其组合都不足以定位时,那么可以利用其兄弟节点或者父节点等各种可以定位的元素进行定位
轴名称 释义
ancestor 选取当前节点的所有祖先节点(包括父节点)
parent 选取当前节点的父节点
preceding 选取当前节点之前的所有节点
preceding-sibling 选取当前节点之前的所有兄弟节点
following 选取当前节点之后的所有节点
following-sibling 选取当前节点之后的所有兄弟节点
使用语法:
/轴定位::节点名称[@属性=值]
示例:
//div/table//td//preceding::td
以前程贷为例:
http://120.78.128.25:8765/Index/index.html
//a[text()="抢投标"];//找到三个 抢投标,不能够唯一的定位到 强投标按钮
-------------------------------那么如何 定位 强投标 元素呢-----------------------------
(1)ancestor
//span[text()=" 借借借"]/ancestor::div/div/div[3]/div/a;//这里父节点div找到4个,div不加索引,默认从第一个父节点div 一层层往下找
1 如下面的html结构,div1-div4都是span的祖先节点
(2)parent 和following-sibling 结合使用
//span[text()=" 借借借"]/parent::div/parent::a/following-sibling::div[1]/div[3]//a
//span[text()=" 借借借"]/parent::div/parent::a/following-sibling::div[1]/div[3]//a[text()="抢投标"];//通过文本定位当然可以,但是没有必要,因为//a直接可以定位到了,再通过text()就多此一举了
1 )先找到span标签的父节点 div----如下面的html结构,这里的父节点指的是div2
(2)轴定位://span[text()=" 借借借"]/parent::div/parent::a/following-sibling::div[1]/div[3]//a
parent::div 找爸爸
parent::a 找爷爷
following-sibling::div[1] 找爷爷的兄弟节点
(3)xpath用法 适应web和app