直接上需要注意的点
一、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可以解决以上的问题
这个过程中遇到的各种坑数不胜数
但也一一解决了,希望幸运的小伙伴看到这篇文章可以有所启发吧