xpath无疑是UI自动化使用最多的定位方式,但做过UI自动化的同学都知道,代码调试出现最多的问题就是NoSuchElement。
例如,当你要点击上图列表,还在使用右键-检查-copy xpath的方式吗?
当然,这样是可行的。但如果列表顺序变动,比如新增了菜单或权限不同时,相对位置发生变动,你所copy的xpath便失效,则需要重新维护代码。
对于<a>标签,selenium提供了两种根据文字的便捷定位方法:find_element_by_link_text 和 by_partial_link_text
但只对<a>标签有效。
而xpath也包含三中类似的便捷定位方法:text(), contains, starts-with
text()是一个宝藏方法,其强大、暴力、无脑、简便…可根据可见文字直接定位元素。
例如,//*[text()=“添加”],直接定位页面上的添加按钮。甭管是什么标签,什么<li><botton><div>的,上来直接//*无脑找元素。
当然也有一些特殊情况。比如,我要定位一个如上图的菜单,但它显示的数字是实时变化的。
这时还可以结合contains定位,即包含,可理解为类似"%A%"的模糊匹配。
但此时筛选出了11个符合条件的元素,结果不唯一。
那么可以再添加一个class属性为条件,因为其他符合条件的元素都不具有class属性。
这里又是一个偷懒小技巧:[@class]找出只要有class属性的元素就可以,不必写值是什么,那不重要。
同理,还有一种starts-with方法,也是类似的效果:
匹配以某些字符开头的元素,可以理解为类似于"A%"的模糊匹配。
因此,一味无脑的copy xpath虽然开始编码时可能方便一点,但代码繁琐,且极不稳定,也不易理解。
是时候去升级你的自动化代码了。