前言
之前一直用的appium1.4版本,最近升級到了1.6突然發(fā)現(xiàn)之前的腳本好多都跑失敗了,一看報錯:
selenium.common.exceptions.InvalidSelectorException: Message: Locator Strategy 'name' is not supported for this session
查了資料才發(fā)現(xiàn),在appium1.5之后,by name的這種定位方式已經(jīng)徹底移除。。。腦闊疼,又要大改代碼了。
突然想到之前通過name定位的方法,被我寫在公共方法里面的:
def get_name(name):
'''
定位頁面text元素
:param name:
:return:
'''
element = driver.find_element_by_name(name)
return element
實際上,只要改一下這個 get_name的公共方法就可以,而不用去修改所有代碼,慶幸。
改進(jìn)
上帝為你關(guān)上一扇門,必然為你打開一扇。同樣appium也是如此,為你移除一種定位方式,必然有另一種定位方式可以代替他,遂轉(zhuǎn)向萬能的xpath。

image.png
xpath語法
簡單了解一下xpath語法,主要有如下表達(dá)式:
| 表達(dá)式 | 描述 |
|---|---|
| nodename | 選擇節(jié)點的所有子節(jié)點 |
| / | 從根節(jié)點選取 |
| // | 從匹配選擇的當(dāng)前節(jié)點選擇文檔中的節(jié)點,而不考慮它們的位置 |
| . | 選取當(dāng)前節(jié)點 |
| .. | 選取當(dāng)前節(jié)點的父節(jié)點 |
| @ | 選取屬性 |
常用通配符
| 通配符 | 描述 |
|---|---|
| * | 匹配任何元素節(jié)點 |
| @* | 匹配任何屬性節(jié)點 |
| node() | 匹配任何類型的節(jié)點 |
對于上圖的text元素我們就可以寫成:
//*[@text='通訊錄']
更嚴(yán)謹(jǐn)點,可以寫成:
//android.widget.TextView[@text='通訊錄']
so,以前的定位方式就改進(jìn)完成了,代碼如下:
def get_name(name):
'''
定位頁面text元素
:param name:
:return:
'''
# element = driver.find_element_by_name(name)
# return element
element = driver.find_element_by_xpath("http://*[@text='%s']")%(name)
return element
問題完美解決