小程序自动化之minium

本文采用微信开发者工具和minium进行编码

官方文档:小程序云测-MiniTest

环境搭建:

  • 1.  python安装minium第三方库,执行minium -v 验证
    •    
      pip install minium
  •  2. 下载微信开发者工具文档版本
    • 下载链接: 微信开发者工具下载地址与更新日志 | 微信开放文档
  •  3. 设置微信开发者工具
    • 小程序自动化之minium_第1张图片
  • 4. 找开发要源代码

框架介绍:

小程序自动化之minium_第2张图片

1. cases:  测试用例基类和公共方法

        BaseCase.py: 测试用例的基类

        BasePage.py: 页面的公共方法

2. outputs:  测试报告存放目录

3. pages:  页面元素和动作,一个页面一个类

4. test: 测试用例

5. route.py: 公共路径

6. config.json: 项目配置

7. suite.json: 批量运行配置

 

代码示例:

1. 编写配置文件 config.json

{
    "project_path": "D:/workspace/csx-taro-bbc/miniapp", # 小程序源代码路径
    "dev_tool_path": "D:/WXKFZGJ/kfzgj/cli.bat",   # 微信开发者工具路径
    "platform": "ide",   # 运行平台
    "outputs": "outputs",  # 日志输出目录
    "debug_mode": "warn"   # 日志打印级别
  }

2. 编写 suite.json 批量运行文件

{
    "pkg_list": [
      {
        "case_list": [
          "test_*"
        ],
        "pkg": "test.*_test"
      }
    ]
  }

3. 首先编写测试用例的基类: cases-->base--> BaseCase.py ; 继承minium.MiniTest

# 重写miniumTest中的setUpClass、tearDownClass、setUp、tearDown方法

from pathlib import Path
import minium


# 初始化类

class BaseCase(minium.MiniTest):
    '''测试用例基类'''

    @classmethod
    def setUpClass(cls):
        super(BaseCase, cls).setUpClass()
        output_dir = Path(cls.CONFIG.outputs)  # 获取outputs
        if not output_dir.is_dir(): # 判断outputs是否是目录
            output_dir.mkdir()

    @classmethod
    def tearDownClass(cls):
        super(BaseCase, cls).tearDownClass()
        cls.app.go_home()

    def setUp(self):
        # super(BaseCase, self).setUp()
        pass

    def tearDown(self):
        # super(BaseCase, self).tearDown()
        pass

 4. 编写页面的公共方法: cases-->base-->BasePage.py

# 定义一些公共方法
import time


class BasePage:

    def __init__(self, mini):
        self.mini = mini
        self._build_elements()
        self._build_actions()

    def sleep(self, seconds):
        """延时"""
        time.sleep(seconds)
        return self

    @property
    def current_page(self):
        """ 获取顶层元素 """
        return self.mini.app.get_current_page()

    """ 获取元素 """
    def get_element(self, selector, inner_text=None, text_contains=None, value=None, max_timeout=20):
        return self.mini.app.get_current_page().get_element(selector, inner_text=inner_text,
                                                            text_contains=text_contains,
                                                            value=value, max_timeout=max_timeout)

    """ 获取指定所有元素 """
    def get_elements(self, selector, inner_text=None, max_timeout=20):
        return self.mini.app.get_current_page().get_elements(selector, inner_text=inner_text, max_timeout=max_timeout)

    '''跳转到指定页面'''
    def navigate_to_open(self, route):
        self.mini.app.navigate_to(route)
        return self

    '''跳转到指定页面并关闭当前页面'''
    def redirect_to_open(self, route):
        self.mini.app.redirect_to(route)
        return self

    '''跳转到tabbar页面,关闭其他非tabbar页面'''
    def switch_to_tabbar(self, route):
        self.mini.app.switch_tab(route)
        return self

    '''跳转到非原生tabbar页面'''
    def switch_to_not_tabbar(self, selector, str=None):
        self.mini.page.get_element(selector, inner_text=str).click()
        return self

    @property  # 获取当前路径
    def current_path(self):
        return self.mini.page.path

    def _build_elements(self):
        # 首先用self.__class__将实例变量指向类,然后再去调用Elements类属性
        self.elements = self.__class__.Elements(self)

    def _build_actions(self):
        self.actions = self.__class__.Actions(self)

    class Elements(object):
        """ 页面元素类 """
        def __init__(self, page):
            self.page = page

        def sleep(self, seconds):
            self.page.sleep(seconds)
            return self

    class Actions(object):
        """ 页面动作类 """
        def __init__(self, page):
            self.page = page

        def sleep(self, seconds):
            self.page.sleep(seconds)
            return self

 

5. 编写pages--> pagesclass.py; 封装页面的元素和动作

from cases.base.BasePage import BasePage

# 继承页面的公共方法

class shoppingTrolleyPage(BasePage):

    class Elements(BasePage.Elements): # 继承页面公共方法中的Elements类

        @property
        def lifting(self):   # 每一个元素都定义一个函数
            """ 购物车页面选择配送方式为 自提 """

            text_class = "text#_n_205"
            return self.page.get_element(text_class, inner_text="自提")

    class Actions(BasePage.Actions):  # 继承页面公共方法中的Actions类

        def click_lifting(self):      # 每一个动作都定义一个类
            """ 点击自提 """
            
            # self.page=object; elements(此时是Elements类) 
            self.page.elements.lifting.click()  
            return self

        

6. 编写测试用例 test-->pageclass_test.py

import minium

import route
from cases.base.BaseCase import BaseCase
from pages import pageclass


@minium.ddt_class
class ClassifyPagetest(BaseCase):

    def __init__(self, methodName):
        super(ClassifyPagetest, self).__init__(methodName)
        self.shoppingpath = pageclass.shoppingTrolleyPage(self)  # 调用页面元素和动作


    def test_ClassifyPath(self):
        # 进入购物车
        self.shoppingpath.switch_to_tabbar(route.cartPage).sleep(5)

        # 点击自提
        self.shoppingpath.actions.click_lifting().sleep(2)

7. 终端执行用例

minitest -m test.pageclass_test -c config.json -g  # 单个执行

minitest -s suite.json -c config.json -g   # 执行套件

python -m http.server 12345 -d outputs #  测试报告;浏览器输入 http://localhost:12345 访问

 

你可能感兴趣的:(python小程序自动化,自动化,小程序)