解決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 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。
