直接上需要注意的點
一、flutter開發的app一般不需要進行id定位
1.最常用的元素定位是Description
2.輸入框定位是text
這兩個完全夠用了
二、通過xpath進行Description定位時會遇到以下問題:
1.python -m weditor調出weditor后可能會遇到這樣的xpath
這樣的xpath會讓你不得不使用resource-id進行定位,寫出來的代碼是這樣的
d.xpath('//[@resourceid="android:id/content"]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.view.View[1]/android.view.View[1]/android.view.View[1]/android.view.View[1]/android.widget.ImageView[1]/android.view.View[2]/android.view.View[1]/android.view.View[2]/android.view.View[1]/android.view.View[1]/android.view.View[4]')
但事實上,通過這個resource-id定位的元素也是可以用Description進行定位的
可以先用print(d.dump_hierarchy(True)),打印出當前頁面的xml
打印出了當前的“去登錄”元素是可以使用Description進行定位
比如:d(description="去登錄")或者d.xpath(//*[@content-desc="去登錄"])
2.如果你的content-desc遇到了這樣的符號: ---這代表的是flutter的換行符,你需要將其替換為‘\n’
三、 我的處理辦法
封裝了一個方法,用來處理所有的description元素
1.使用init方法,將d這個對象傳入,可以方便后續做數據驅動時實例化對象
2.將xml進行過濾,找到所有符合我們界面看到的元素,然后進行字符串拼裝成xpath的參數
3.最后可直接點擊
4.如果遇到了某種手機在對應步驟后表現可能不同,比如:小米手機鍵盤在輸入后遮擋了下方元素,便可以使用return的false返回進行判斷,多進行操作一步再次點擊這個元素
class DescriptionClick(object):
def __init__(self, d, ele_id=0):
self.d = d
self.ele_id = ele_id
def click(self, ele_name):
elements_list = []
return_list = []
# 獲取xml
ele_xml = self.d.dump_hierarchy(True)
# 正則表達式
page_re = re.compile(r'content-desc="(.*?)" checkable="')
# 獲取匹配結果
ele_res = re.findall(page_re, ele_xml)
# 過濾空的元素,其他元素加入至elementsList
for i in ele_res:
if i == '':
continue
else:
elements_list.append(i)
# 將xml中的換行符替換為\n,並組合成xpath
for j in elements_list:
if j.startswith(ele_name):
xpath = '//*[@content-desc="' + str(j).replace(' ', '\n') + '"]'
return_list.append(xpath)
# 直接點擊這個xpath
try:
self.d.xpath(return_list[self.ele_id]).click()
except IndexError:
return False
結尾:最初拿到flutter開發的應用時,我人傻了,appium很多的方法在app中無法使用,比如sendkeys這些常用必須的方法
我翻了很久的論壇,發現使用uiautomator2可以解決以上的問題
這個過程中遇到的各種坑數不勝數
但也一一解決了,希望幸運的小伙伴看到這篇文章可以有所啟發吧