Flutter-uiautomator2之自动化测试避坑(元素篇)

直接上需要注意的点

一、flutter开发的app一般不需要进行id定位

  1.最常用的元素定位是Description

  2.输入框定位是text

  这两个完全够用了

二、通过xpath进行Description定位时会遇到以下问题:

  1.python -m weditor调出weditor后可能会遇到这样的xpath

Flutter-uiautomator2之自动化测试避坑(元素篇)

 

 

   这样的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

  Flutter-uiautomator2之自动化测试避坑(元素篇)

 

   打印出了当前的“去登录”元素是可以使用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可以解决以上的问题
这个过程中遇到的各种坑数不胜数
但也一一解决了,希望幸运的小伙伴看到这篇文章可以有所启发吧
上一篇:MySQL命令学习笔记


下一篇:The last packet successfully received from the server was 3 milliseconds ago. The last packet sent