selenium自动化测试中,元素定位是有8种基本方式,如id、Name、class、CSS、XPath、link_text等。方法多样,但是具体的定位中如何选择何种定位比较合适? 如何能跳出定位错误的坑,如何能准确的定位到元素呢?这是值得我们思考的问题。
首先我们会疑问为什么要选择xpath定位呢?它有什么优势?这是大部分的人的疑问。xpath定位在定位路径的基础上结合了id、name、class等属性,让定位更准确。相比单个id、name、class属性定位,xpath定位的优势是很明显的。下面我们对xpath做详细的介绍。文章中有疏漏的地方请多包涵。
xpath常用符号
/ 表示绝对路径绝对路径是指从根目录开始
// 表示相对路径
. 表示当前层
.. 表示上一层
* 表示通配符
@ 表示属性
[] 属性的判断条件表达式
xpath常用函数
contains (): xpath(‘//div[contains(@id,”widget”)]’),选择id属性中包含'widget'的div
text(): xpath(‘//a[text()=”hello world”]’),选择文本值为'hello world'的节点
last(): 选择最后一个
starts-with(): xpath(‘//div[starts-with(@id,”common”)]’),选择id属性中’common’开头的div节点
not(): 否定
xpath绝对路径定位
从html标签开始,一层一层往下写标签,直到这个标签位置。
比如:dr.find_element_by_xpath("/html/body/div[2]/form/input")
div][2] 代表第2个 div标签,注意,索引从1开始而不是0,此方法缺点显而易见,当页面元素位置发生改变时,都需要修改。这种定位标签需要一个个的找,也是比较麻烦的事情。因此,并不推荐使用。
Xpath相对路径定位
相对路径,以‘//’开头,具体格式为 xxx.find_element_by_xpath("//标签")
比如:dr.find_element_by_xpath("//input[x]") #定位第x个input标签,[x]可以省略,默认为第一个
相对路径的长度和开始位置并不受限制,也可以采取以下方法:
xxx.find_element_by_xpath("//div[x]/form[x]/input[x]"), [x]依然是可以省略的
xxx.find_element_by_xpath("//*[x]/form[x]/input[x]"), 用*代替tag标签
xpath标签属性定位
标签属性定位,相对比较简单,也要求属性能够定位到唯一元素,如果存在多个相同条件的标签,默认只是第一个,具体格式dr.find_element_by_xpath("//标签[@属性=‘属性值’]")
属性判断条件:最常见为id,name,class等等,目前属性的类别没有特殊限制,只要能够唯一标识一个元素都是可以的
具体例子:
dr.find_element_by_xpath("//a[@href='/industryMall/hall/industryIndex.ht']")
dr.find_element_by_xpath("//input[@value='确定']")
dr.find_element_by_xpath("//div[@class = 'submit']/input")
当某个属性不足以唯一区别某一个元素时,通过逻辑运算符and去定位 ,具体例子:
dr.find_element_by_xpath("//input[@type='name' and @name='kw1']")
当标签属性很少,不足以唯一区别元素时,但是标签中间中间存在唯一的文本值,也可以定位,其具体格式: dr.find_element_by_xpath("//标签[contains(text(),'文本值')]")
具体例子:xxx.find_element_by_xpath("//iunpt[contains(text(),'型号:')]")
注意:尽量在html中复制此段文本,避免因为肉眼无法分辨的字符导致定位失败
xpath截取文字定位
其他的属性值如果太长,也可以采取截取文字方法定位,请看示例
属性higy=‘https://blog.csdn.net/huiseqiutian/article/details’
dr.find_element_by_xpath(“//a[contains(@higy,‘details’)]”)
xpath网页中的动态属性定位
例如,在某些网页中动态生成id属性值,可以有以下方法:
1.starts-with例子: //input[starts-with(@id,'ctrl')] 解析:匹配以ctrl开始的属性值
2.ends-with例子://input[ends-with(@id,'_userName')] 解析:匹配以userName结尾的属性值
3.contains()例子://Input[contains(@id,'userName')] 解析:匹配含有userName属性值