腾讯出品小程序自动化测试框架【Minium】系列(六)常见组件的处理

写在前面

我发现一件神奇的事,当你学一门新技术或者新的知识点遇到不会的时候,真的可以先放一放,第二天再去学习,也许说不定也就会了。

为什么这么说?

昨天文章断断续续的写了近一天,有一个组件不认识,自然也不知道该怎么处理,真的憋得脑子疼,后来一合计算了,事已至此,还是先吃饭吧,就扔一边了。

结果今天再一看,发现 居然我会了,而且一个不留神,就把小程序的官方API都给过完了,所以这就再来更新了。

常见组件的处理

switch组件处理

image.png

改变 switch 组件的状态

示例代码如下:

def test_switch(self):
    '''
    switch 组件处理演示,可以脑补下单选框状态切换场景
    :return:
    '''
    self.app.navigate_to("/packageComponent/pages/form/switch/switch")
    self.page.get_element(".page-section.page-section-gap > view.body-view > switch:nth-child(1)").switch()
slide组件处理
image.png

slider 组件滑动到指定数值

示例代码如下:

def test_slide_to(self):
    '''
    slider组件处理演示
    :return:
    '''
    self.app.navigate_to("/packageComponent/pages/form/slider/slider")
    element_slider = self.page.get_element('page > view > view > view:nth-child(1) > view.body-view > slider')
    element_slider.slide_to(5)
    time.sleep(1)
    self.assertEqual(element_slider.value, 5, "slider ok")
pick组件处理
image.png

picker 组件选值

Parameters:

名称类型默认值说明
value看下表Not None属性名称

value 的取值:

选择器类型类型说明
selector: 普通选择器int表示选择了 range 中的第几个 (下标从 0 开始)
multiSelector: 多列选择器int表示选择了 range 中的第几个 (下标从 0 开始)
time: 时间选择器str表示选中的时间,格式为"hh:mm"
date: 日期选择器str表示选中的日期,格式为"YYYY-MM-DD"
region: 省市区选择器int表示选中的省市区,默认选中每一列的第一个值

示例代码如下:

def test_picker(self):
    '''
    picker组件处理演示。修改当前时间
    :return:
    '''
    self.app.navigate_to("/packageComponent/pages/form/picker/picker")
    callback_called = threading.Semaphore(0)  # 监听回调, 阻塞当前主线程

    def callback(args):
        nonlocal callback_args
        callback_args = args
        callback_called.release()

    els = self.page.get_elements("picker")
    self.app.hook_current_page_method('bindTimeChange', callback)
    els[1].click()  # 阻止picker弹起
    els[1].pick('11:18')  # 用trigger模拟pick完成的动作
scroll_to组件处理
image.png

scroll-view 容器滚动操作

Parameters:

名称类型默认值说明
xintNonex 轴上滚动的距离
yintNoney 轴上滚动的距离

示例代码如下:

def test_scroll_to(self):
    '''
    scroll_to组件处理演示
    :return:
    '''
    self.app.navigate_to("/packageComponent/pages/view/scroll-view/scroll-view")
    callback_args = None
    callback_called = threading.Semaphore(0)  # 监听回调, 阻塞当前主线程

    def callback(args):
        nonlocal callback_args
        callback_args = args
        callback_called.release()

    # 监听滚动事件, 方便最后验证滚动结果
    self.app.hook_current_page_method("scroll", callback)
    # 这里只演示的事横向移动,主要找准你要移动的控件,整错了铁定没法移动
    els = self.page.get_elements("scroll-view")
    els[2].scroll_to(x=150)  # 横向滚动150像素
    self.assertTrue(callback_called.acquire(timeout=10), "callback called")
    self.assertEqual(callback_args[0]["detail"]["scrollLeft"], 150, "pick ok")
swipe组件处理
image.png

切换 swiper 容器当前的页面

Parameters:

名称类型默认值说明
indexintNone索引值,从 0 开始

示例代码如下:

def test_swipe_to(self):
    '''
    swipe组件处理演示
    :return:
    '''
    self.app.navigate_to("/packageComponent/pages/view/swiper/swiper")
    el = self.page.get_element("swiper")
    # 切换到第二个tab,轮播图的C
    el.swipe_to(2)
    print(el.attribute('current'))
    self.assertEqual(el.attribute('current'), ['2'], "swipe ok")
move组件处理
image.png

movable-view 容器拖拽滑动

Parameters:

名称类型默认值说明
xintNonex 轴方向的偏移距离
yintNoney 轴方向的偏移距离

PS: x,y 偏移量相对于movable-area左上角,如示例中,movable-area左上角为(25, 25)

示例代码如下:

def test_move_to(self):
    '''
    move组件处理演示
    :return:
    '''
    self.app.navigate_to("/packageComponent/pages/view/movable-view/movable-view")
    element = self.page.get_element("movable-view")
    # 把movable-view复位
    element.move_to(0, 0)
    time.sleep(2)
    # 移动到坐标为100, 100的地方
    element.move_to(100, 100)
video、audio 组件
image.png

详见代码示例

video组件处理示例代码如下:

def test_video(self):
    '''
    video组件处理演示
    :return:
    '''
    self.app.navigate_to("/packageComponent/pages/media/video/video")
    element_video = self.page.get_element("video")
    # 播放
    element_video.play()
    time.sleep(2)
    # 暂停
    element_video.pause()
    time.sleep(2)
    # 跳转到指定位置(拖到50秒位置播放)
    element_video.seek(50)
    time.sleep(2)
    element_video.play()
    # 1.5倍速播放
    element_video.playback_rate(1.5)
    time.sleep(2)
    # 进入全屏播放
    element_video.request_full_screen(90)
    time.sleep(2)
    # 发送弹幕
    element_video.send_danmu('我是弹幕君!!')
    time.sleep(2)
    # 退出全屏
    element_video.exit_full_screen()
    time.sleep(2)
    # 播放
    element_video.stop()

audio组件处理示例代码如下:

def test_audio(self):
    '''
    audio组件处理演示
    :return:
    '''
    self.app.navigate_to("/packageComponent/pages/media/audio/audio")
    element_audio = self.page.get_element("audio")
    element_audio.play()  # 播放音频
    element_audio.seek(10)  # 快进音频
    element_audio.pause()  # 暂停音频
    element_audio.set_src('http: // ws.stream.qqmusic.qq.com / M500001VfvsJ21xFqb.mp3?guid = ffffffff82def4af4b12b3cd9337d5e7 & uin = 346897220 & vkey = 6292asdad & fromtag = 46')  # 设置音源链接

其他示例

单页面示例

直接跳转到被测试的页面,进行脚本的测试。

示例代码如下:

def test_set_data(self):
    '''
    单页面示例
    :return:
    '''
    self.app.navigate_to("/packageComponent/pages/content/text/text")
    self.page.data = {
        'text': "只能加文字,不能删除文字",
        'canAdd': True,
        'canRemove': False
    }
    time.sleep(1)
    self.capture("canAdd")
    self.page.data = {
        'text': "只能删除文字,不能加文字",
        'canAdd': False,
        'canRemove': True
    }
    time.sleep(1)
    self.capture("canRemove")
数据驱动测试

测试框架继承自unittest,基于ddt封装的的简单封装。

示例代码如下:

# -*- coding: utf-8 -*-
"""
# @Time    : 2023/02/06 20:31
# @Author  : longrong.lang
# @FileName: test_base.py
# @Software: PyCharm
# @Blog    :https://www.cnblogs.com/longronglang/
# @Motto:ABC(Always Be Coding)
"""
import minium


@minium.ddt_class
class BaseTest(minium.MiniTest):
    @minium.exit_when_error
    def test_init(self):
        """
        这条用例失败会退出测试计划,minium.exit_when_error可以用来修饰初始化用例
        """
        self.assertEqual(1, 1)

    @minium.ddt_case(1, 2, 3)
    def test_ddt(self, value):
        """
        数据驱动测试,这个case会自动展开成3条用例:
        test_ddt_1_1
        test_ddt_2_2
        test_ddt_3_3
        """
        self.assertIn(value, [1, 2, 3])


if __name__ == '__main__':
    BaseTest.test_ddt()

写在最后

关于Minium使用教程已经全部更新完了,要想学习全部可以从Minium系列教程从头学起,下篇文章将会为大家分享基于Minium的测试框架设计及开发,感兴趣的同学可以蹲一下,我是六哥,觉得文章对您有用,请星标并转发即可!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pytest ui自动化测试实战主要包括安装并配置环境、练习pytest基本使用、练习selenium基本使用以及使用pytest和selenium实现UI自动化测试四个部分。在练习pytest基本使用中,我们可以通过编写简单的用例格式来实现对测试目的和要求的覆盖。而在练习selenium基本使用中,我们可以使用脚本语言来模拟用户行为操作,接近真实用户场景,实现对web页面的自动化测试。通过这些实践,我们可以了解基于pytest和selenium的UI自动化测试的基本思路,并熟悉这两种测试工具的基本操作。此外,pytest还是一个非常成熟的Python测试框架,它具有简单的用例编写格式和丰富的插件,如pytest-html和pytest-rerunfailures等,可以生成漂亮的测试报告并实现失败用例的重复执行。通过实战,我们可以基本掌握pytest的使用方法。另外,还可以基于pytest实现测试用例收集方案、自定义参数化方案、页面元素定位数据存储方案、测试用例数据存储和维护方案等,以避免重复设计和维护复杂的问题。此外,还可以修改定制并汉化html测试报告,使其更加简洁、美观、易读。同时,还可以封装集成selenium、appiumminium和WinAppDriver等工具,以更好地支持不同平台和应用的自动化测试。总之,通过pytest ui自动化测试实战,我们可以全面了解和掌握UI自动化测试的基本原理和实践技巧。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [软件测试案例|使用 pytest+selenium 进行UI自动化测试](https://blog.csdn.net/qq_41640218/article/details/124031645)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [基于pytest设计自动化测试框架实战](https://blog.csdn.net/hotswwkyo/article/details/103211805)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值