解决appium升级后不支持使用name定位的问题
- 2019 年 10 月 6 日
- 筆記
前言
之前一直用的appium1.4版本,最近升级到了1.6突然发现之前的脚本好多都跑失败了,一看报错:
selenium.common.exceptions.InvalidSelectorException: Message: Locator Strategy 'name' is not supported for this session
查了资料才发现,在appium1.5之后,by name的这种定位方式已经彻底移除。。。脑阔疼,又要大改代码了。
突然想到之前通过name定位的方法,被我写在公共方法里面的:
def get_name(name): ''' 定位页面text元素 :param name: :return: ''' element = driver.find_element_by_name(name) return element
实际上,只要改一下这个 get_name的公共方法就可以,而不用去修改所有代码,庆幸。
改进
上帝为你关上一扇门,必然为你打开一扇。同样appium也是如此,为你移除一种定位方式,必然有另一种定位方式可以代替他,遂转向万能的xpath。

image.png
xpath语法
简单了解一下xpath语法,主要有如下表达式:
|
表达式 |
描述 |
|---|---|
|
nodename |
选择节点的所有子节点 |
|
/ |
从根节点选取 |
|
// |
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
|
. |
选取当前节点 |
|
.. |
选取当前节点的父节点 |
|
@ |
选取属性 |
常用通配符
|
通配符 |
描述 |
|---|---|
|
* |
匹配任何元素节点 |
|
@* |
匹配任何属性节点 |
|
node() |
匹配任何类型的节点 |
对于上图的text元素我们就可以写成:
//*[@text='通讯录']
更严谨点,可以写成:
//android.widget.TextView[@text='通讯录']
so,以前的定位方式就改进完成了,代码如下:
def get_name(name): ''' 定位页面text元素 :param name: :return: ''' # element = driver.find_element_by_name(name) # return element element = driver.find_element_by_xpath("//*[@text='%s']")%(name) return element
问题完美解决
作者:迈阿密小白 链接:https://www.jianshu.com/p/6d71624cb5bb 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
