网页的组成
- 元素
- 元素名称
- 元素属性
- 元素内容
Xpath
定义:XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
语言真的是特性十足,有编程语言,标记语言,还有专门用来找位置的语言,还有专门用来装饰门面的语言。一个 Xpath 的大概印象,打开浏览器,可以复制元素的 xpath 看一看。
这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。/文件/文件/
语法
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
绝对定位和相对定位
绝对定位/
和相对定位//
,绝对定位可以在浏览器中 copy xpath 获取。要判断xpath的写法是否正确,chrome 中 ctrl + F
可以输入xpath 表达式。
- 绝对定位的劣势
- 族谱的例子,第一页开始,相对定位,我认识雨神萧敬腾跟你什么关系。
- 前端经常变化,加 div 之类的。
*
通配符 和 *@
绝对的XPath是所有元素都从根元素的位置(HTML)开始定位,只要应用中有轻微的调整,会就导致你的定位失败。但是通过就近的包含id或者name属性的元素出发定位你的元素,这样相对关系就很靠谱,因为这种位置关系很少改变,所以可以使你的测试更加强大。
不到万不得已不要用下标,因为太容易变化了。通常是在不好区分的父节点且没有可以区分的子节点,比如说在同一个父级下的两个完全一样的元素。
谓语条件(Predicates)
谓语被嵌在方括号中,用来查找某个特定的节点或者包含某个指定的值的节点,也就是额外的条件。文本也可以定位。
@*
- 进一步提高精度。
- -starts-with 顾名思义,匹配一个属性开始位置的关键字 contains 匹配一个属性值中包含的字符串 text() 匹配的是显示文本信息,此处也可以用来做定位用
# 第一个元素,注意索引是从 1 开始的,不是 0
e.find_element_by_xpath("/form[1]")
# 条件表达 有 method 属性
e.find_element_by_xpath("/form[@method]")
# 条件表达 method == "POST"
e.find_element_by_xpath("/form[@method='POST']")
# 综合使用,form 下有一个option元素的value属性为 yuwen
e.find_element_by_xpath("/form[//option/@value='yuwen']")
通配符和逻辑运算 and or
其他操作参考 w3school
选取若干个结果 |
层级定位和路径表达
如果碰到两个一模一样的元素,所有的属性条件都用了,还是匹配不出来啊,怎么去区分?必须要去父级对象,同胞,祖先去找了。举例,百度的登录。
参考 windows 和 linux 的文件路径:
/
下一层//
所有下层.
当前层..
上一层@value
有 value 属性的
例子://form/option 和 //form//option 和 //form/@value 的区别
如果想找 form 下 有 option 标签,而且 value == ‘yuwen’ 的元素呢?
//form//option[@value='yuwen']
Xpath的综合运用
获取课堂派里的人名,需要注意 contains text(),
获取后面的勾,那就很无奈了。通过路径祖先,祖先也一样。 我们找人,通过名字,属性找,人太普通,跟其他人找得太像了,通过祖先去找,或许他的祖先个性很鲜明,找虎虎,很多人叫虎虎,他爸爸叫沈从文,大作家。
祖先也没有明显特征,怎么办?通过兄弟姐妹。
轴定位
表示:
/轴名称::节点名称
例://div//table//td//preceding::td
- 轴定位包含了路径寻找,如果需要多层往上,轴定位更加方便。
- 兄弟姐妹都可以
场景:需要通过兄弟姐妹祖先来符合查找的时候,自己没什么特征。列表,table
例子: 找课堂派里高斯后面的 勾。
ancestor:祖先结点 包括父
parent:父结点
preceding: 当前元素节点标签之前的所有结点。(html页面先后顺序)
preceding-sibling: 当前元素节点标签之前的所有兄弟结点
following: 当前元素节点标签之后的所有结点。(html页面先后顺序)
following-sibling:当前元素节点标签之后的所有兄弟结点