解决appium升级后不支持使用name定位的问题

前言

之前一直用的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。


解决appium升级后不支持使用name定位的问题_第1张图片
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

问题完美解决

你可能感兴趣的:(解决appium升级后不支持使用name定位的问题)