Appium Appium 微信小程序 UI 自动化

grizz · 2018年07月03日 · 最后由 TesterWa 回复于 2023年01月29日 · 8399 次阅读

前言:

运行环境:

Android 7.0
+Appium 1.6.3

微信小程序是啥?

我们一个 app 里面除了 native 页面,还有 H5 页面,那么其实小程序也不过是正常的webview(webview 是一个基于 webkit 引擎、展现 web 页面的控件),本质还是H5(H5 是 HTML5 的简称)。我们对 app 做 UI 自动化时,可以操作 app 的 H5 页面,那么同样的我们也可以操作微信 app 的小程序。

webview 和 H5 的关系?

app 里面可以打开一个 webview,webview 中加载 H5 页面,即包含关系是:app > webview > H5。

一.打开微信的调试功能

通过在微信中点击打开http://debugx5.qq.com,或者直接扫下面二维码
,进入微信 X5 调试页面的配置


点击信息,然后勾选【打开 TBS 内核 Inspector 调试功能】

打开后我们对于微信就有更多的操作性,在chrome://inspect/#devices中也能看到更多的页面

二. Chrome 查看页面元素

手机连接电脑,终端输入:adb devices,查看是否连接成功。如下展示设备号则为连接成功


进入小程序,以【天天连连线】为例,在 Chrome 浏览器访问chrome://inspect/#devices(温馨提示:需要 *** 才能查看页面元素)

有没有小伙伴想问 57.0.2987.132 是什么意思,这是android system Webview的版本。android system Webview是安卓的一个浏览器内核,手机上的应用可以通过调用它来直接显示网页内容。那么对我们有什么影响吗,我们可以把它当成我们的 Chrome 浏览器版本 chrome=57.0.2987.132,它要跟我们的 chromedriver 版本对应 (如果不对应会导致上下文切换失败,无法进行后面的操作),我们才能正常操作 webview。我们可以理解为 appium 会调 chromedriver,chromedriver 去调 android system Webview,最后 android system Webview 可以控制我们小程序的 webview。

上面两张图好像是一个页面,但是显示不一样?左边的图是 macaca 的 app-inspector 中的,它显示的跟我手机页面一致,右边是 Chrome 的 inspect 页面,地址是:https://servicewechat.com/wxbc6682586d0990ea/14/page-frame.html,即是个 HTML 页面。所以如果小程序页面中用 native 写出来的控件,在 Chrome 的 inspect 页面是显示不出来的,因为它只显示 HTML 元素,也支持我们定位 HTML 元素。左边的 macaca 的 app-inspector 对于 native 元素的定位是肯定没问题的,但是如果有些 HTML 元素我们用 app-inspector 不好定位时,可以选择 Chrome 的 inspect。

三、查找小程序的进程

为什么要知道微信小程序的进程呢?

微信里面的小程序多不胜数,不同的小程序可能运行在不同的进程中。我们知道 app 的页面层会分 native 和 webview,像上一张图中,小程序 webview 页面地址https://servicewechat.com/wxbc6682586d0990ea/14/page-frame.html后缀是 html,即是一个 webview。我们使用 appium 做 UI 自动化时默认上下文是NATIVE_APP

如何查看【天天连连线】运行在哪个进程中?

adb shell dumpsys activity top | grep ACTIVITY
adb shell ps 23498

我们可以看到,当前的小程序运行在com.tencent.mm:appbrand0中,记住这个进程,记住啦。

四、Appium 控制小程序的 demo

appium 控制小程序,跟我们正常不同的一点就是:需要添加chromeoptions,值为{'androidProcess': 'com.tencent.mm:appbrand0'}androidProcess的值就是com.tencent.mm:appbrand0,即小程序的进程。

附:python 写的一个简单 demo

from appium import webdriver
desired_caps = {
            'platformName': 'Android',
            'fastReset': 'false',
            'noReset': True,
            'platformVersion': '7.0',
            'deviceName': '58d1a05c',
            'appPackage': 'com.tencent.mm',
            'appActivity': 'com.tencent.mm.ui.LauncherUI',
            'fullReset': 'false',
            # 'unicodeKeyboard': 'True',
            # 'resetKeyboard': 'True',
            'chromeOptions': {
                'androidProcess': 'com.tencent.mm:appbrand0'
                }
            }
driver = webdriver.Remote('http://0.0.0.0:4723/wd/hub', desired_caps)
driver.find_element_by_android_uiautomator('text("微信")').click() #点击微信Tab
# 定义一个滑动屏幕的方法
def swipeDown(t):
    x = driver.get_window_size()['width']
    y = driver.get_window_size()['height']
    x1 = int(x * 0.5)  # x坐标
    y1 = int(y * 0.25)  # 起始y坐标
    y2 = int(y * (0.25 + t))  # 终点y坐标
    driver.swipe(x1, y1, x1, y2, 500)
swipeDown(0.4) # 向下滑动屏幕的40%,准备从顶部进入小程序
driver.find_element_by_android_uiautomator('text("天天连连线")').click() #点击顶部的图标进入小程序
print driver.contexts  # 打印当前所有的上下文
# [u'NATIVE_APP', u'WEBVIEW_com.tencent.mm:appbrand0', u'WEBVIEW_com.tencent.mm:support', u'WEBVIEW_com.tencent.mm:tools', u'WEBVIEW_com.tencent.mm:appbrand1']
driver.switch_to.context('WEBVIEW_com.tencent.mm:appbrand0') #切换上下文为WEBVIEW_com.tencent.mm:appbrand0
driver.find_element_by_xpath("/html/body/wx-view/wx-view[4]/wx-form/span/wx-button").click() # 这个是HTML页面的元素

最后关于 switch_to.context 上下文切换的问题,我想说一下的就是,最开始自己用的一个乐视超级手机,想操作 webview 页面,切换上下文偶尔切换成功,这个偶尔很致命,找了很久没找到原因,然后不经意间换了一台小米手机,代码没变,但切换失败?不存在的。
还有就是自己看过不少 appium 操作 webview 的文章,基本都是说操作 webview 前要切换上下文,有些说划重点说不需要切换 webview,我亲身感受是,是的,有些 webview 元素不切换也可以操作,但是有些 webview 不切换就操作不了,坑挺多的。建议就是操作 H5 前首先确认chromedriver 版本对应,不切上下文能操作就不切 (因为个人觉得 native 稳定一点),切了上下文还不好使,那就换手机试试吧。

欢迎交流指正,感谢阅读。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 23 条回复 时间 点赞

之前弄过一下,有些手机小程序干脆只有一个 native,webview 一个都没,我之前一个小米 6,怎么都切不了上下文,chromedriver 都换了 N 个版本,就是切不了。一点办法都没。感觉测小程序自动化得根据手机定制化代码。

小程序的自动化还跟腾讯的小程序更新有关系,腾讯自己的 tbs 内核

grizz #23 · 2018年07月04日 Author
落羽之梦 回复

我用的是小米 5S,一直不行的,看错误日志应该可以看出来,实在搞不定也可以在社区发帖,里面有很多大神

grizz #24 · 2018年07月04日 Author
zzx 回复

我看到的帖子好像都没有提及到这一点

grizz 回复

我小米 6 切不了 webview 是就卡在切换那里,直到超时。

落羽之梦 回复

我之前也超时,原因是 android system Webview(57.0.2987.132) 的版本跟 chromedriver 没对应,换了 chromedriver 就好了

grizz 回复

你们说的更换 chromedriver 是怎么回事,怎么换的?

grizz #12 · 2018年07月12日 Author
t-bug 回复

chromedriver 版本对应 (下载)

以 Chrome 57 为例,只要下载 chromedriver 2.29
mac 下放到/usr/local/bin 目录下,Windows 放到 Python 的根目录下 (Python 需设置为环境变量)
上面的针对的是 WEB 自动化,更改 appium 的 chromedriver 的话,更换/usr/local/lib/node_modules/appium/node_modules/_appium-chromedriver@4.2.0@appium-chromedriver/chromedriver/mac/下的 chromedriver 即可,名称保持不变

@grizz 为什么我配置
'chromeOptions': {
'androidProcess': 'com.tencent.mm:appbrand0'
}
参数之后,appium 每次就不启动微信了,而且启动谷歌浏览器

tongyx 回复

自己可以多尝试看一下 appium 的运行日志,基本每个操作都会有详细日志

grizz 回复

是因为使用了 3.7.1 版本的 selenium-api,强制将 browserName 参数设为 chrome
public ChromeOptions() {
this.setCapability("browserName", "chrome");
}
需要后面将 browserName 清空就行了

grizz #12 · 2018年07月18日 Author
tongyx 回复

selenium2.X 的兼容性比较好,相对于 selenium3.X 建议使用 selenium2.X,顺畅很多

grizz 回复

这几的微信疯狂的暗改,微信小程序用 chrome://inspect/#devices 已经获取不到元素了,全被替换成原生的了。

我的是已经成功切换进 webview 了,但是总是报找不到元素的错误,可以说是相当的蛋疼了。。

grizz #13 · 2018年08月28日 Author
醉春风 回复

可能跟是否使用 TBS 内核有关,设置地址 (微信内打开):http://debugtbs.qq.com

关闭"内核未被禁用",点击重启生效。在微信打开我们要调试的 H5 页面,页面下拉能看到:QQ 浏览器 X5 内核提供技术支持,就代表我们在微信内操作用的是 TBS 内核,否则下拉没有内容
如果是 react 写的页面 (我们项目是这样的),使用 TBS 内核,则需要切换 webview,禁用 TBS 内核时页面类似原生,不需要切换 webview 既可定位。
禁用 TBS 内核,定位微信内的 H5 页面如图 (基本所有 H5 元素都可以像 native 元素一样定位):

16楼 已删除

完美解决问题,困扰了我好几天,谢谢楼主!
还有些困惑:
①既然有这种不用切换 webview 的方法,但在我之前查的教程里都没提到过这个,是这种方法会存在有什么弊端吗?还是说这个方法只有在某些特定的情况下才会使用吗
②chrome://inspect/#devices 查看页面和使用微信 web 开发者工具查看页面,这两者之间会有啥区别么?

grizz #15 · 2018年08月28日 Author
醉春风 回复

刚刚微信响了一下,感谢认可。。
1、很多教程里面没有,这个是的,我也看过很多都没有写到,实践中填坑时发现的,准备下个帖子写一下的😂
弊端的话,重装或重置 (一般我们不会做这个操作) 会重置内核选项。微信内核可能自己升级,我们用 Android 系统内核除非自己升级系统才会升级内核,禁用后可控性更高,而且更方便。只是换了内核目前没发现特定的情况,希望深入踩坑的人多发贴
2、chrome://inspect/#devices只能查看 html 页面,当我们把微信的页面禁用 TBS 内核后,原本在 chrome 的 inspect 能看见的微信页面会看不见,因为页面已经被识别成 native,chrome 的 inspec 无法查看 native 页面,微信 web 开发者工具应该可以查看微信的所有页面

这个小程序是没问题,像小红书之类的小程序呢?

hi,我的 inspect 的文件 html 是这个。。。 是我哪里配置问题么? 而且我不开启 “TBS 内核小程序调试功能” 的话,这个 html 也看不到

推荐这一套方案:https://github.com/richshaw2015/wxapp-appium 经过工程实践检验过

每次自动化打开微信都要重新走一遍登录的流程,能不能直接进到微信

grizz #23 · 2020年10月28日 Author
jerrywei 回复

可以的,你看下启动命令,别每次启动都 reset 应用

回复内容未通过审核,暂不显示
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册