UI自动化元素定位中,我们常用的定位方法就是XPath。
XPath定位十分灵活,定位时也可以借助一些函数取辅助定位。
接下来就以【百度首页】为例,部分HTML脚本如下所示:
<div id="u_sp" class="sisindex-1570-spmenu"> <a href="https://voice.baidu.com/act/newpneumonia/newpneumonia/?from=osari_pc_1" target="_blank" id="virus-2020" class="mnav sp dot">抗击肺炎</a> <a href="http://news.baidu.com" target="_blank" class="mnav">新闻</a> <a href="https://www.hao123.com" target="_blank" class="mnav">hao123</a> <a href="http://map.baidu.com" target="_blank" class="mnav">地图</a> <a href="https://haokan.baidu.com/?sfrom=baidu-top" target="_blank" class="mnav">视频</a> <a href="http://tieba.baidu.com" target="_blank" class="mnav">贴吧</a> <a href="http://xueshu.baidu.com" target="_blank" class="mnav">学术</a>
获取元素“抗击肺炎 ”,可以有多少中方法呢?
#层级目录 //div/a #text()定位 //div/a[text()='抗击肺炎'] #contains方法定位,每个标签的href不同 #方法介绍:contains(str1,str2),用来判断str2是否是第一个字符串的一部分。 //div/a[contains(@href,'voice')] #starts-with定位,每个标签的href开头不同 #方法介绍:statrs-with(str1,str2),用来判断str2是否是第一个字符串的开头 //div/a[starts-with(@href,'http://voice')] #ends-with定位,每个标签的href结尾不同,备注:ends-with是XPath2.0的语法,1.0不支持 #方法介绍:ends-with(str1,str2),用来判断str2是否是第一个字符串的结尾 //div/a[ends-with(@href,'from=osari_pc_1')] #如果ends-with无法使用,可以换另外一种方法 #方法介绍1):substring(string,number,length),用来截取字符串。string用于指定要截取的字符串,number用于指定开始位置,length用于指定截取字符串的长度。 #方法介绍2):string-length(string),用来返回参数string的长度。 //div/a[substring(@href, string-length(@href) - string-length('from=osari_pc_1') +1) = 'from=osari_pc_1'] #通过某父级找到子级 //div/child::a[1] #通过父级,找多层子级,定位后代元素 //div/descendant::a[1] #那么是否支持多层子级,多层父级别呢? #通过子级找到父级 //div/a[text()='抗击肺炎']/parent::div //div/a[text()='抗击肺炎']/.. #通过子代定位,找到多层父级,定位先代元素 //div/a[text()='抗击肺炎']/ancestor::div
#通过某个元素找兄弟元素 #找元素地图的下一个a标签 //div/a[text()='地图']/following-sibling::a[1] #找元素地图的下N个a标签 //div/a[text()='地图']/following-sibling::a[N] #找元素地图的上一个a标签 //div/a[text()='地图']/preceding-sibling::a[1] #找元素地图的上N个标签 //div/a[text()='地图']/preceding-sibling::a[N]
获取一种元素我们大概可以有十几种方法!!
实际场景中需要多练习总结,找到适合自己产品的定位方法,过程中也欢迎大家补充其它的方法。