minium小程序自动化初体验


昨天学习了一下 minium , 感觉比较一般吧, 体验感不怎么样, 环境搭建的过程中就遇到问题了,所幸都解决了,希望这篇文章能帮助到你。

minium 是什么

是微信官方推出来的小程序自动化工具, 不仅可以做UI 的测试, 还能做函数的mock 等。
小程序的官网是 https://minitest.weixin.qq.com/#/

环境要求

python3.8 及其以上, 微信开发者助手 这两个工具

小程序自动化的原理

python 通过 Minitest 去控制 微信开发者工具。

小程序自动化和Web UI 自动化的异同之处

界面运行
小程序:模拟/真机
Web: 浏览器

自动化
Web自动化: selenium 调用浏览器驱动让浏览器页面自动操作
小程序自动化: 微信开发者工具作为驱动对象, 使用模拟器自动页面操作或者真机页面自动操作

环境安装中遇到的问题以及解决方法

我发现,使用python3.8d的虚拟环境,无法安装 这个 minium(有一个包, Pillow 报错) , 必须要用本地环境才可以(视频里可以用虚拟环境安装成功, 估计和操作系统是苹果有关, 也可能是下载整个 minium的 .whl 文件单独安装的 )
我的环境是python3.8 和 pycharm 2019, 我也试过使用pycharm 2019 创建 python3.10 的虚拟环境,但是创建虚拟环境失败, 
可能是python 3.10 的创建虚拟环境方法变了, 不是 pycharm 里 默认的创建方式。 

pip install minium 
安装成功后,  用 minitest -v  看到minium 的信息


minium 配置文件

用pycharm 新建一个项目, 在项目的根目录下,新建一个 myconfig.json 

json文件如下
{


  "dev_tool_path": "微信web开发者工具的安装路径\\cli.bat",
  "project_path": "小程序源码的路径"

}
其中, 微信web开发者工具后面的\\cli.bat 在首次运行之前是不存在, 编译运行过一次后就会有了

minium 的简单用例

import minium


class TestMiniDemo(minium.MiniTest):
    def test_clothes(self):
        # 点击进来就显示的弹窗
        self.page.get_element('van-overlay').click()

        self.page.get_element("view", text_contains="上装").click()

        self.page.get_element("view", text_contains="小票打印机工厂定制版").click()

        text = self.page.get_element("view", inner_text="小票打印机工厂定制版").inner_text
        result = text == "小票打印机工厂定制版"
        self.assertTrue(result,  "断言的同时截图页面")

写完用例之后, 可以用 minitest -c config.json  -m TestDemo -g  去执行
-c 是指定配置文件,  -m 是指定执行的模块  -g 是产出测试报告

过程中遇到的问题(一)启动报错 编码不符合

启动报错, 说编码不符合, “UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xae in position 199: illegal multibyte sequence”
但是我是通过 minium的启动命令来读取文件的, 我自己并没有写 open 方法。我把pycharm的文件编码都改成utf-8,重新新建myconfig.json也没用。
解决方法如下:
跟着终端的报错信息找到minium的配置文件,我的配置文件是E:\work\python38\Lib\site-packages\minium\framework\miniconfig.py 这个文件,修改其中读取文件的默认格式

    @classmethod
    def from_file(cls, filename, encoding='utf-8'):
        logger.info("load config from %s", filename)
        _, ext = os.path.splitext(filename)
        with open(filename, "r", encoding=encoding) as f:
            if ext == ".json":
                json_dict = json.load(f)
            elif ext == ".yml" or ext == ".yaml":
                json_dict = yaml.load(f)
            else:
                raise RuntimeError(f"unknown extension {ext} for {filename}")

        if isinstance(json_dict, list):
            config_list = list()
            for c in json_dict:
                if not c.get("base_dir"):
                    c["base_dir"] = os.path.dirname(os.path.abspath(filename))
                config_list.append(MiniConfig(c))
            return config_list
        if not json_dict.get("base_dir"):
            json_dict["base_dir"] = os.path.dirname(os.path.abspath(filename))
        return MiniConfig(json_dict)

找到这段代码, 原来 encoding=None, 修改成默认是utf-8 即可

过程中遇到问题(二)打开小程序就出现的弹窗,无法定位,vant标签的原因

弹窗无法定位
我尝试使用 xpath, css 都无法定位,百思不得其解,
后面找了以前的前端同事才知道,这个是vant标签,功能不在基本页面, is=”miniprogram_npm/@vant/weapp/overlay/index”, 通过这里去找到对应的wxml 文件并打开

<van-transition
  wx:if="{{ lockScroll }}"
  show="{{ show }}"
  custom-class="van-overlay"
  custom-style="z-index: {{ zIndex }}; {{ customStyle }}"
  duration="{{ duration }}"
  bind:tap="onClick"
  catch:touchmove="noop"
>
  <slot></slot>
</van-transition>
<van-transition
  wx:else
  show="{{ show }}"
  custom-class="van-overlay"
  custom-style="z-index: {{ zIndex }}; {{ customStyle }}"
  duration="{{ duration }}"
  bind:tap="onClick"
>
  <slot></slot>
</van-transition>

从这个文件中看到, 绑定了tap点击功能, 所以必须要用tagname去获取。

过程中遇到的问题(三)代码走了,但是小程序页面都不动,类似无头模式

小程序页面
debug
debug2
截图
问题猜测: 可能我这个小程序的源码是直接从github 拉下来,点击运行就能在控制台看到报错,有可能是因为一些后台接口报错了,页面就不跟着代码变动而变动了。
小程序报错
只是我们手动操作小程序,遇到报错, 也不影响我们后面的操作。


文章作者: 陌上人如玉
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 陌上人如玉 !
  目录