目前小程序调试了两个品牌的手机,一个是小米4W,一个是华为荣耀honor 9i。说下这两部手机调试下来的不同点吧。(先调试的小米4,所以那时候踩得坑,不太记得有哪些问题了,主要是总结华为这次调试的结果)
所有的调试都基于我们公司的小程序上调试,不能代表全部调试问题总结。
有疑问的加V了解详情:zx1187463903
先说明针对这个模块文件的修改
1:去掉file://开头或者attached:false的脏数据(原始框架只是过滤了file开头的脏数据,但是调试华为手机,发现还会出现一条不是file开头,但是attached:false的脏数据,所以加上这个条件,remove这条数据)
def _cleanJsonData(self, responseJson):
removeList = []
for response in responseJson:
if u'file:///' in response['url'] or u'''"attached":false''' in response['description']:
removeList.append(response)
for i in removeList:
responseJson.remove(i)
2:原始框架sencondLastPageMessage是取pageUrlDictLength-1,但调试小程序发现,pageUrlDictLength=7,应该取pageUrlDictLength-6,也就是第二个值,所以就重写了获取这个值的方式sencondLastPageMessage(因为不确定,其他情况pageUrlDictLength值是几)
# sencondLastPageMessage = self.pageUrlDict.get(self.pageMap.get(pageUrlDictLength - 1))
sencondLastPageMessage = self.pageUrlDict.get(self.pageMap.get(1))
3:为什么不用这种获取pid的方式呢,因为有些手机adb得到的最顶层进程不仅仅是微信一个程序,当出现多条数据的时候就先将微信进程com.tencent.mm的进行分割,找到微信的那条数据,然后再对pid值进去分离获取.这样就可以不管是几个进程,都可以获取到微信的pid值.
首先以华为caz-tl20为例,CMD,执行命令:adb shell dumpsys activity top | findstr ACTIVITY找到小程序的进程,如下:
# strlist = stdout.split('pid=')
# pid = strlist[1].split("\r\n")[0]
strlist = stdout.split('com.tencent.mm/.plugin.appbrand.ui.')
str = strlist[1].split('pid=')
pid = str[1].split("\r")[0] #这里更改为“\r”分割,之前是“\r\n”结尾,但现在adb得到的结果是以“\r\r\n”结尾,所以直接用“\r”来分割。
webviewCmd = _ADB_GET_WEBVIEW_TOOLS_CMD[osName] % (pid)
注意:华为mate20,如果走mate20作为测试机,你会发现,从搜一搜得到的进程pid可以运行的,但是注意这里的进程名称是“com.tencent.mm/.plugin.appbrand.ui.AppBrandInToolsUI”,和其他手机不同的是:其他手机进程“ ACTIVITY com.tencent.mm/.plugin.appbrand.ui.AppBrandUI”得到的pid是可以运行的,但mate20不可以。所以如果选择mate20作为测试机,最好走搜一搜进入。如下图,区别可以和上面的截图做对比。
4:原始框架上eventData增加了一个[object Text]
eventData = u'[object Text][object HTMLDivElement][object Text][object Text]'
为什么多加一个[object Text],因为调试发现,返回正确的值和框架里的值一直不是同一个,无法进入下一步,少了一个[object Text],所以加上才能调试通过。
针对这个模块的修改
1:重新写了一个输入的方法inputElementByXpath,使用ADBKeyBoard.apk代替inputPlug.apk,(如果也是使用adb输入法记得把与input输入法有关的注销掉)
def inputElementByXpath(self, xpath, text, needClick=True):
"""
安装adbkeyboard.apk实现adb中文输入,目前方法只针对windows系统
:param xpath: 控件的xpath地址
:param text: 输入的文字
:return:
"""
self.logger.info('xpath ---> ' + xpath + ' text ---> ' + text)
if needClick:
self.clickElementByXpath(xpath)
if self.isElementExist(xpath):
commandHelper.runCommand("adb shell am broadcast -a ADB_INPUT_TEXT --es msg '" + text.encode('cp936') + "'")
self.wait(WAIT_REFLESH_05_SECOND)
使用方法:
self.wxDriver.inputElementByXpath('//*[@id="mainPage"]/div[1]/div[2]/ul/li[1]/p/input', 'FAutoTest测试')
2:新增了滚动屏幕的操作,不过框架里自带的这个滚动屏幕的方法(scrollToElementByXpath)也很快,相比较而言,推荐框架自带的方法(scrollToElementByXpath).
def swipeUp(self, n, t=100):
'''
向上滑动屏幕
举例,屏幕高560,宽360
向上滚动,x1=180,y1=420,y2=140
由之前的位置(180,420)上移到(180,140)
'''
height = self.getWindowHeight()
width = self.getWindowWidth()
x1 = width * 0.5
y1 = height * 0.75
y2 = height * 0.25
for i in range(n):
self.d.swipe(x1, y1, x1, y2, t)
使用方式:
self.wxDriver.swipeUp(3)
这里的3,就是滚动的次数,自己根据需要来设置。
3:为了提高速度,先将这一句滚动的操作注释掉