微信小程序自動化測試-----小米 M4W,華爲榮耀honor 9i ,華爲 caz-tl20以及華爲mate20 pro的調試

目前小程序調試了兩個品牌的手機,一個是小米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:爲了提高速度,先將這一句滾動的操作註釋掉
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章