Appium 我膨胀了,测试必要商城小程序,用了 3 种方式!:)

清菡 · 2020年12月05日 · 最后由 MarvinWu 回复于 2020年12月10日 · 2458 次阅读

坚持原创输出,点击蓝字关注我吧

作者:清菡
博客:oschina、云 + 社区、知乎等各大平台都有。

目录

  • 一、Appium 结合 Python 做小程序自动化
  • 二、Python 第三方库 Uiautomator2 做微信小程序、公众号自动化
  • 三、FAuto Test 微信小程序、公众号 H5 自动化神器
  • 四、总结

一、Appium 结合 Python 做小程序自动化

搜一搜:如果从来没有搜索过,在这里点击一下它,历史记录是空的。但是如果曾经搜索过,那一定有历史记录。如果不是第一次点击它,用自动化脚本再次点击的话,不会让你输入进去,会报错。

那就只能从历史记录中来选,所以点击一下后要等到历史记录中的信息出来。

等待搜索框出现 - 点击搜索框之后呢,等待了 5 秒钟。time.sleep(5),等待历史记录中 “必要商城” 出来。

可以看到是历史记录没错,但是历史记录它是一个 WebView。

这个 WebView 是微信这个程序的,不属于小程序,是属于微信这个应用的。所以这个东西不对外开放,你就没有办法知道 “必要商城” 对应的元素定位是什么。

不知道怎么办?它又不是一个完整的元素,要在一个元素上点点点,只能用坐标,因为微信不给开 Debug 属性。

用坐标,通过 adb 命令执行点击操作,adb shell input tap 281 205281 205 是坐标点。

如果有多个历史记录,坐标肯定会变。自己的手机,保证历史记录对应的位置正确就好了。假设测试机也是自己操作,就是测试环境要保持独立。

当然想办法保证数据是一直都在的。微信中只要搜索过都是有历史记录的,而且平常使用的时候不会走这条途径,不会在这里搜一搜,直接在首页搜一搜就好了。

点击了必要商城之后,还不够。坐标可以取百分比,但是要注意百分比要控制好。进入必要商城后,这个地方仍然是个 WebView,我还是没有权限,只能继续用坐标。

但是这个地方坐标范围就很大了,“必要商城 - 小程序” 这一整块都可以点击,选一个中间的点,这里用比例算一下,应该还是可以的。

大概预估一下,在多个机型中试一下,因为这个需要你不断测试,测试调整百分比基数的,确保你达到一定的成功率。点击进入小程序页面:

这个地方都可以识别,这个地方其实不属于微信了。只是通过微信的渠道来访问到这样的一个东西。类似于把这个小型 Web 网站系统嵌入到这个里面来了。

这里面的内容,在 Web 网页随便都能找到的。所以这个地方一进来之后就要切换,但是加载也需要时间。所以加载的时间要稍微等一等。

首页、我的、分类、购物车是可以作为 App 应用程序识别的。

可以保证首页、我的、分类、购物车出现,然后 sleep 5 秒钟,尽量保证中间区域可以加载出来。

这里用到了 14 秒钟。10 秒也是可以的,因为这里比较慢。现在打印当前所有的上下文cons=driver.contexts。打印出来后,要切换到 context,这个时候切换和之前的 WebView 是不一样的。

列出来的 WebView 名字当中,有 2 个跟腾讯有关的,这个 toolsmp 是我选的,之前有com.tencent.mm:tool。WebView 可能有 2-3 个,只要进入想要的WEBVIEW_com.tencent.mm:toolsmp,这个是我们在这里指定识别到的程序:

切进来之后,其实就是个小型的应用系统嵌在这里面来了。那它可能就不止一个窗口了。不像一个页面中那么简单,小程序就复杂一点。

可能不止一个窗口,所以在进来之后,不要着急,不要认为肉眼看到的,当前就在这个页面。

还需要你先获取当前的所有窗口句柄,要判断你要操作的元素是否在当前的页面当中。如果不在,那就得换一个,因为一个窗口句柄就代表一个页面。

所以获取了当前所有的窗口的句柄:hs=driver.window_handles,拿到之后对它做了个遍历:

for handle in hs:
    driver.switch_to.window(handle)
#首先切换到这个窗口当中,因为我不知道哪个窗口包含了我要的元素,切换完成之后,我会判断一下
#当前这个窗口对应的页面的源码当中,有没有我要找的。比如窗口中有很多必要商城相关的,可以写必要商城相关的,各种文字都可以用,比如女装、美妆啊。
    print("切换到窗口:",handle)
    time.sleep(3)
    #print(driver.page_source)
    if driver.page_source.find("热门") !=-1:
        break

如果能找到热门这个字,那我就认为当前是正在我操作的页面。然后就不再进行后续遍历了,因为遍历的过程中是相当于已经切进来了的,如果当前确实很符合条件,就不再遍历也不再切换到别的窗口,就在当前窗口。

确定当前操作的窗口页面是什么之后,接下来的事就是找元素,操作元素。和 Web 自动化一样。注意:Chromedriver 要准备好。切换的时候要准备 Chromedriver。

二、Python 第三方库 Uiautomator2 做微信小程序、公众号自动化

除了这一种方式之外,还有一种方式。就是纯 Python 代码,不需要搞的这么复杂。

现在是通过 Appium,Python 也有一个 Uiautomator2 这样的一个第三方库,不需要通过 Appium,可以直接和安卓手机通信。(这是国内某位大神写的,专门支持 Python 的)

地址:https://github.com/xiaocong/uiautomator

三、FAuto Test 微信小程序、公众号 H5 自动化神器

另外一种微信小程序、公众号 H5 的自动化,就是在这个基础上做了个封装。这个叫做FAuto Test

它是基于 Python,但是它有一个缺陷,目前只支持 Python2,还没有开放到 Python3。

腾讯自己做的开源的框架:https://github.com/Tencent/FAutoTest

可以试下上面官方文档中封装好的代码,可以下载个 2.7 的 Python 装下,2.7 和 3.4 并不冲突,装 2 个版本就好了。

但是环境变量,配置一个版本就可以了,不需要把 2.7 配上去,直接配 3.4。

环境变量运行的时候只识别一个。如果你配置了两个环境变量,只识别前一个,后面那个等于没有配置是一样的。

在写代码的时候可以选择用哪个版本来写。环境变量配置常用的 3 点几的版本,2 点几不用配,直接使用就好了。

四、总结

用 Appium 结合 Python 代码,问题比较多,比较尴尬。这个代码里进程名称比较固定,不太固定是真正在小程序里操作的是什么。

但是这个是 Web 自动化。Web 自动化怎么做就怎么做,重点是前面的一些固定的方式。

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

正片看下来,感觉没有干货,可能是我比较菜吧。
1.微信小程序不知道什么时候引入了 chrome 内核?为什么会有 chromedriver?微信不是一直都是 x5/64 位内核吗?如果用到了 chrome 内核,怎么从微信内核切换,如果切换了,这时候已经不是 appium 了,而是 selenium 了吧,坑有点大啊。
2.uiautomator2 为什么给了个 uiautomator 链接?

那个 Fauto test 好像是不维护了吧, 我昨天看了半天 他的 bug 列表有人反馈新版本微信不支持, 只之粗很老的微信版本,一直没有人维护更新

这么麻烦,直接 airtest 他不香吗?

4楼 已删除
江涛依旧 回复

我这是系列文章 ,你的第一个疑问,上篇文章写了,这是地址:https://mp.weixin.qq.com/s/3VNXSJ-Xx7II3upfbtkVXQ
自己去看

第二个疑问,这个链接确实是 automator 的官方文档

liya678 回复

是的,这个只是一种方法,不一定就要用它

用例数,执行效率,稳定性,可维护性,啥都没有,也不知道膨胀个啥

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册