自动化测试之“微信小程序”

微信版本:7.0.4
Appium:当前最新版
chromedriver: 2.40 (因为微信使用的webkit版本是66.0,二者要有一个对应关系)

环境配置:win10+python3+appium+红米手机(4.4.4)+微信7.04

环境配置

第一步

安装JDK,至少JDK 1.7或以上。并正确设置JAVA_HOME.

第二步

安装Android SDK(安卓软件开发包)并配置ANDROID_HOME. 把adb.exe加入环境变量

命令行执行adb devices确保可以找到设备,并且不是offline的状态。

C:UsersAdministrator>adb devices
List of devices attached
* daemon not running; starting now at tcp:5037
* daemon started successfully
7C5A15B32368    device
第三步

安装node.js并把npm加入环境变量。由于Appium的server端是node.js编写的所以需要先安装node.js。安装node.js后,可以直接通过npm安装Appium

第四步

安装appium服务端,可通过cmd 下输入 npm install -g appium 进行安装。(安装过程较慢,请耐心等待)
如果npm install -g appium特别慢,无法下载时,可以用国内的镜像npm –registry http://registry.cnpmjs.org install -g appium

或者我们可以在Appium官方网站上下载操作系统相应的Appium版本。
https://bitbucket.org/appium/appium.app/downloads/
当前最新版本为 AppiumForWindows_1_4_16_1.zip ,注意这是一个 Windows 版本,如果你的电脑为MAC请下载 appium-1.5.3.dmg

安装好appium,执行appium-doctor会自动检查相关配置是否已经配置正确。

注:如果提示:“appium-doctor”不是内部或外部命令,找到Appium的安装目录,例如:
C:Program FilesAppiumnode_modules.bin添加到环境变量path

C:UsersAdministrator>"C:Program Files (x86)Appiumnode_modules.binappium-doctor.cmd"
Running Android Checks
✔ ANDROID_HOME is set to "C:UsersAdministratorAppDataLocalAndroidSdk"
✔ JAVA_HOME is set to "C:Program FilesJavajdk1.8.0_191."
✔ ADB exists at C:UsersAdministratorAppDataLocalAndroidSdkplatform-toolsadb.exe
✔ Android exists at C:UsersAdministratorAppDataLocalAndroidSdktoolsandroid.bat
✔ Emulator exists at C:UsersAdministratorAppDataLocalAndroidSdktoolsemulator.exe
✔ Android Checks were successful.

✔ All Checks were successful
第五步

安装appium客户端,用于抓取app上定位信息。
地址:https://github.com/appium/appium-desktop/releases/tag/v1.2.1

第六步

安装Appium-Python-Client
1.前面python环境安装,已经准备好pip了,所以这里直接打开cmd,输入:pip install Appium-Python-Client

第七步

到这里,Windows+Android+appium的所有环境就已经搭建完成了。

获取控件ID

方法一,使用uiautomatorviewer

适用于安卓手机上的网页和APP.

使用的工具是C:UsersAdministratorAppDataLocalAndroidSdktoolsbinuiautomatorviewer.bat

使用方法:

  1. 手机通过USB连接到电脑,并打开一个APP
  2. 电脑上打开uiautomatorviewer
  3. 点击uiautomatorviewer左上角的device screenshot按钮。就可以看到手机上的APP界面显示到了电脑上。比如打开的是手机的计算器,则点击对应的按钮可以看到对应按钮的控件ID.
    微信小程序自动化测试微信小程序自动化测试
    image.png
方法二,使用appium inspector

适用于手机上的网页和APP.

第一步:手机通过USB连接到电脑,并打开一个APP. 启动appium后点击右上角的”start inspector session”

微信小程序自动化测试微信小程序自动化测试
image.png

第二步:在弹出的界面添加”Desired Capabilities”,对于红米手机自带的计算器,添加的信息如下(其中device_name可以随便写看,但是如果有多个设备连接电脑的时候估计是不能随便写的)

微信小程序自动化测试微信小程序自动化测试
image.png

第三步,点击右下角的“start session”
可以看到手机上的计算器被启动,并在电脑上新弹出的窗口里显示出来,并且点击窗口里的控件,在窗口右边可以看到对应的控件id等信息。

方法三,使用chrome inspector

适用于手机上的小程序。

微信小程序自动化测试微信小程序自动化测试
image.png

上图中的“WebView in com.tencent.mm (66.0.3359.126)”是指微信的webkit的版本,下面的“wx9ffdf3412de84572”是一个体验版的小程序。点击旁边的inspect就能在电脑上看到小程序的界面:

微信小程序自动化测试微信小程序自动化测试
image.png

APP自动化测试脚本(示例)

  1. 电脑上启动appium server
  2. 通过USB连接手机
  3. 确保adb devices可以找到手机
  4. 执行下面的脚本。可以看到手机上的计算器被自动启动,并且自动点击按钮,最后执行完毕关闭计算器。
#python3+windows+appium+红米计算器(真机)
from appium import webdriver
import unittest
import time

class TesXiaomiCalc(unittest.TestCase):

    def setUp(self):
        desired_caps = {
            'platformName': 'Android',
            'platformVersion': '4.4.4',
            'deviceName': 'b082512'  #这里可以随便写,大概是因为只有一台设备
        }
        # desired_caps["unicodeKeyboard"] = "True"
        # desired_caps["resetKeyboard"] = "True"
        desired_caps['appPackage'] = 'com.android.calculator2'
        desired_caps['appActivity'] = 'com.android.calculator2.Calculator'
        self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

    def tearDown(self):
        self.driver.quit()

    def test_plus(self):
        self.driver.find_element_by_id("com.android.calculator2:id/digit9").click()
        time.sleep(3)
        self.driver.find_element_by_id("com.android.calculator2:id/minus").click()
        time.sleep(3)
        self.driver.find_element_by_id("com.android.calculator2:id/digit8").click()
        time.sleep(3)
        self.driver.find_element_by_id("com.android.calculator2:id/equal").click()
        time.sleep(20)


if __name__ == '__main__':
    si = unittest.TestLoader().loadTestsFromTestCase(TesXiaomiCalc)
    unittest.TextTestRunner(verbosity=2).run(si)

小程序自动化测试脚本(示例)

步骤:

  1. 通过USB连接手机到电脑并确保可以通过adb devices查到
  2. 启动appium服务端
  3. 执行脚本

python脚本:

#python3+windows+appium+红米计算器(真机)
# coding=utf-8
from appium import webdriver
import unittest
import time

class TesXiaomiCalc(unittest.TestCase):

    def setUp(self):
        desired_caps = {
            'platformName': 'Android',
            'platformVersion': '4.4.4',
            'deviceName': 'A5RNW18316011440',
            'appPackage': 'com.tencent.mm',
            'appActivity': '.ui.LauncherUI',
            'automationName': 'Appium',
            'unicodeKeyboard': 'True',
            'resetKeyboard': 'True',
            'chromeOptions': {'androidProcess': 'com.tencent.mm:appbrand0'},
            'noReset': True, #没有这一句,每次启动时都会提示登录微信
        }
        self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

    def tearDown(self):
        self.driver.quit()

    def test_plus(self):
        time.sleep(50)
        # 使用坐标点击“发现”按钮
        # self.driver.tap([(428,1242),(472,1272)], 500) 
        self.driver.find_element_by_xpath("//*[@text='发现']").click()
        time.sleep(10)
        self.driver.tap([(101,630), (194,672)], 500)  # 点击“小程序”按钮
        time.sleep(10)
        self.driver.tap([(153,553), (246,595)], 500)  # 点击“待测的小程序”按钮
        time.sleep(20)
        # print(self.driver.contexts)
        self.driver.switch_to.context('WEBVIEW_com.tencent.mm:appbrand0')
        # 输出网页源代码,但此时看不到网页上的元素,因为需要重新设置当前handle
        print(self.driver.page_source)
        print('+++++++++++++++++++++++++++++++++++++++++++')
        handles = self.driver.window_handles
        for handle in handles:
            # 由于小程序的限制,每进入一个页面,都要重新设置当前handle
            self.driver.switch_to.window(handle)
            #展示页面源代码,但每个元素前都会加"wx-"前缀,比如wx-view
            print(self.driver.page_source)
        # 通过id点击小程序界面上的按钮
        self.driver.find_element_by_css_selector('#button1').click()
        # 等待5秒钟
        time.sleep(5)

if __name__ == '__main__':
    si = unittest.TestLoader().loadTestsFromTestCase(TesXiaomiCalc)
    unittest.TextTestRunner(verbosity=2).run(si)

Troubleshooting

(1) adb devices找不到安卓手机

大部分的手机连上USB就能识别,但对于个别品牌比如华为手机,大概是因为深度定制的原因,识别效果没有那么好,尝试了各种方法还是失败后最好换个手机。

(2) 手机提示没有安装X5内核

提示没有X5内核,这时候可以在手机上访问http://debugmm.qq.com/?forcex5=true,可以看到提示说功能已设置为ON,再访问http://debugx5.qq.com打开配置界面进行点击“在线安装X5内核”进行安装,安装后再次打开http://debugx5.qq.com就能看到选项可以勾选打开X5的相关配置选项了。

(3) 安卓手机无法打开“打开TBS内核inspector调试功能”(打开微信debug调试)

如果不打开“TBS内核inspector调试功能”, 则微信界面上的“发现”或者“我”等按钮appium无法识别,只能通过坐标来点击。

#在手机上打开下面三个链接中的任何一个,打开X5的调试开关。勾选之后会提示重启,重启后再打开确认一下是不是还是勾选状态。如果不是,多尝试几次,特别是最后一个。
#具体位置:X5调试界面-》信息-》打开TBS内核inspector调试功能
http://debugx5.qq.com
http://debugtbs.qq.com
http://debugmm.qq.com/?forcex5=true
微信小程序自动化测试微信小程序自动化测试
image.png
(4) chromedriver的版本和微信的webkit版本不一致

如果不一致会造成无法驱动小程序页面还有就是chrome-devtools无法显示出内容。

下载与该版本相对应的ChromeDriver.exe替换掉Appium目录下的ChromeDriver.exe,路径:C:UsersmiduoAppDataLocalProgramsappium-desktopresourcesappnode_modulesappiumnode_modulesappium-chromedriverchromedriverwin请根据个人安装情况找到文件并替换。

chromedriver历史版本下载地址:http://chromedriver.storage.googleapis.com/index.html
版本匹配关系:https://sites.google.com/a/chromium.org/chromedriver/downloads

(5) chrome-devtools页面提示404错误

通过USB连接手机,在手机上打开小程序,在电脑的chrome浏览器中输入chrome://inspect,如果能看到小程序,点击inspect, chrome-devtools页面提示404错误,原因是这个工具需要访问谷歌,对方的方法就是FQ. 一般只有第一次需要FQ.

(6) 运行自动化测试后手机输入法突然消失

大概原因是appium安装了自己的输入法,所以需要到设置界面勾选一个之前用到的默认的输入法就可以了。

(7)测试脚本无法输入正确的小程序源代码

原因是没有设置当前handler,当进入小程序界面后要设置当前界面的hanlder,之后每切换一个界面都要重新设置,否则无法获取正确的H5页面(小程序可以理解为就是H5页面)源代码。

(8)切换context报错

切换context的原因是要从微信的native状态切换到小程序的webview上下文。

失败的原因之一是chromedriver的版本和微信的webkit版本不一致。
另外一个原因是:写错了androidProcess的值
还有可能是微信的debug模式没有打开。

(9)adb无法输入中文字符
#安装ADBKeyBoard.apk
$adb install ADBKeyBoard.apk
#设置为默认输入法(也可以手工到设置界面去设置)
$adb shell ime set com.android.adbkeyboard/.AdbIME
(10)查看微信的webkit版本

有两种方法:
方法一: 微信扫码打开 http://httpbin.org/user-agent(在网上随便找一个二维码生成器用这个链接生成二维码,扫码即可打开),即可看到自己的webview版本号(本示例为66),对应的chromedriver版本是2.40:

{
  "user-agent": "Mozilla/5.0 (Linux; Android 7.0; SM-G928V Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044506 Mobile Safari/537.36 MMWEBID/9796 MicroMessenger/7.0.3.1400(0x2700033B) Process/tools NetType/WIFI Language/zh_CN"
}

方法二:使用chrome inspect,参考上面的工具部分。

(11) 获取deviceName

方法一:命令行输入adb devices得到的这串数字就是device name的一部分
前面还要加上品牌和型号:比如手机是lge的,型号是nexus4,device name就是lge-nexus_4-005475cbccd279d4

方法二:利用UI Automator Viewer工具
注:需要有多台Android设备连接PC时才能显示设备列表(模拟器也算),打开UI Automator Viewer工具会提示选择设备,下拉菜单列表里的名字就是deviceName

(12) 获取androidProcess

脚本里的androidProcess是小程序的进程名,可以通过下面的方式获取:

#通过USB连接手机到电脑,并打开小程序,执行如下命令
C:UsersAdministrator>adb shell dumpsys activity top | findstr ACTIVITY
ACTIVITY com.tencent.mm/.plugin.appbrand.ui.AppBrandUI 436c9530 pid=2406

#根据小程序的进程号查看进程名称
C:UsersAdministrator>adb shell ps 2406
USER PID PPID VSIZE RSS WCHAN PC NAME
u0_a96 2406 152 1000728 372048 ffffffff 00000000 R com.tencent.mm:appbrand0
(13)微信版本对自动化测试的支持

目前看来微信对自动化测试的支持时好时坏,微信从6.6.6版本后,小程序的调试入口被封,无法chrome:inspect,但是从6.7.3开始又可以了。现在最新版的7.0.4也是可以的。

(14)开发小程序时添加对自动化测试的支持

给button添加automaitonid属性,对于小程序,自定义属性要添加data-前缀:

   <view class="preview one" data-automationid='demo1' data-demo="1" bindtap="handlePreview1" id='button1' >
    <text>演示一</text>
  </view>

对应的appium+python的小程序自动化测试脚本可以通过如下方式找到这个按钮:

# 通过添加的自定义属性点击小程序界面上的按钮
        self.driver.find_element_by_css_selector('[data-automationid="demo1"]').click()
(15)appium点击坐标使用tap(x, y)无效

如果选取控件的最中间那个店的坐标,tap(x,y)时无效,解决方法是使用tap([(x1,y1),(x2,y2)],100), 其中的x1y1和x2y2可以通过ui automator viewer获取,100是毫秒,意思是点击动作是100毫秒。

但点击坐标是下下策,不到万不得已不要使用。

(16)小程序自动化测试的时候手机上一定要安装chrome浏览器吗

不需要。

我目前测试的时候电脑上的CHROME版本是75.0, 手机上的也安装的是75.0. 网上说手机上也要装并且要保持版本号一致,我把手机上的卸载掉还可以正常运行小程序的自动化测试脚本。

(17)小程序自动化测试时微信号被冻结

没办法,按提示解冻即可。

(18)APPIUM每次都会安装一个unlock,提示让点击确定

解决需要手动安装AppiumSettings、Unlock、AndroidInputManager的问题

找到appium安装目录
C:Program Files (x86)Appiumnode_modulesappiumlibdevicesandroid

打开android.js修改代码,注释掉弹出setting和unlock的代码(但要首先确定手机上已经安装好了这两个软件)

    //this.initUnicode.bind(this),
    //this.pushSettingsApp.bind(this),
    //this.pushUnlock.bind(this),
    //this.unlock.bind(this),
(19)命令行模式下运行appium服务端

d

FAtest微信小程序自动化框架

#第一步,下载并安装python2.7
#第二步,安装相关依赖
$python -m pip install uiautomator==0.3.2
$python -m pip install lxml==4.2.3
$python -m pip install bidict==0.17.0
$python -m pip install websocket-client==0.44.0

#第三步,安装FAtest。 (whl文件请在dist目录下手动下载,下载地址:[https://github.com/Tencent/FAutoTest](https://github.com/Tencent/FAutoTest))
#如果提示错误“File is not a zip file"”,一般是因为whl文件被损坏所致,重新下载即可
#如果无法保证当前使用的pip是python2的,切换到python2目录使用pip的绝对路径
$pip install fastAutoTest-2.2.3-py2-none-any.whl

References

https://github.com/richshaw2015/wxapp-appium
https://www.cnblogs.com/feifei-cyj/p/7666224.html
https://www.jianshu.com/p/efe9dcf8bbaf
https://www.jianshu.com/p/090c04f3b077
https://www.jianshu.com/p/92bed52a8acd
https://www.jianshu.com/p/2662ec47415e
https://www.jianshu.com/p/e629ba5baf42

       

留言

本站文章如未特殊注明,均为原创,转载请注明出处: 未必平凡  本文链接地址: https://vv2014.com/1411.html