百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

小程序自动化测试神器(五)API详解(下)

bigegpt 2024-08-09 11:18 2 浏览

写在前面

又有好久没更新小程序自动化测试框架「Minium」系列文章了,主要真的太忙,尽量做到每周一更吧,还请大家能够理解!

上篇文章为大家分享关于MiniumMinium、App模块的API 使用,接下来将为大家继续分享MiniumAPI的使用。

Page中API的使用

data

?

当前页面数据, 可直接赋值

?

Page({
    data: {"testdata1": 1}
})

「示例代码如下:」

def test_data(self):
    """
    data演示数据
    :return:
    """
    self.app.navigate_to("/packageComponent/pages/view/view/view")
    page = self.app.get_current_page()
    data = page.data
    self.assertDictEqual({'theme': 'light'}, data)
    data["theme"] = "red"
    page.data = data
    page.data = {"theme1": "light1"}
    page = self.app.get_current_page()
    print(page.data)
    self.assertDictEqual({'theme': 'red', 'theme1': 'light1'}, page.data)

element_is_exists()

?

在当前页面查询元素是否存在

?

「Parameters:」

名称 类型 默认值 说明 selector str Not None css选择器或以/或//开头的xpath max_timeout int 10 超时时间,单位 s inner_text str None 通过控件内的文字识别控件 text_contains str None 通过控件内的文字模糊匹配控件 value str None 通过控件的 value 识别控件 xpath str None 显式指定xpath

「示例代码如下:」

def test_element_is_exists(self):
    """
    验证在当前页面元素是否存在
    :return:
    """
    self.app.navigate_to("/packageComponent/pages/view/view/view")
    is_exists = self.page.element_is_exists("view", inner_text="B", max_timeout=5)
    self.assertEqual(True, is_exists," 在当前页面元素存在")

get_element()

?

获取页面元素

?

「Parameters:」

名称 类型 默认值 说明 selector str Not None CSS选择器或以/或//开头的XPath inner_text str None 通过控件内的文字识别控件 text_contains str None 通过控件内的文字模糊匹配控件 value str None 通过控件的 value 识别控件 max_timeout int 0 超时时间,单位 s xpath str None 显式指定XPath, 小程序基础库2.19.5后支持

「PS: selector 仅支持下列语法:」

  • ID选择器:#the-id
  • class选择器(可以连续指定多个):.a-class.another-class
  • 标签选择器:view
  • 子元素选择器:.the-parent > .the-child
  • 后代选择器:.the-ancestor .the-descendant
  • 跨自定义组件的后代选择器:custom-element1>>>.custom-element2>>>.the-descendant
    「custom-element1 和 .custom-element2必须是自定义组件标签或者能获取到自定义组件的选择器」
  • 多选择器的并集:#a-node, .some-other-nodes
  • xpath:可以在真机调试的wxml pannel选择节点->右键->copy->copy full xpath获取,暂不支持[text()='xxx']这类xpath条件
  • 「自定义组件不支持穿透, 需要先get自定义组件, 再使用Element.get_element获取其子节点, 或使用[>>>]连接自定义组件及其后代元素, 如发现无法正常定位, 可根据这个方法辨别自定义组件」
  • 更多元素定位实例

「Returns:」

  • Element

实例代码如下:

def test_get_element(self):
    '''
    获取页面当前元素
    :return:
    '''
    self.app.navigate_to("/packageComponent/pages/view/view/view")
    element = self.page.get_element("view",inner_text="A", max_timeout=5)
    print(element.inner_text)
    print(element.inner_wxml)

get_elements()

?

获取一组元素

?

「PS: 支持的选择器同 get_element()」

「Parameters:」

名称 类型 默认值 说明 selector str Not None css选择器或以/或//开头的xpath max_timeout int 0 超时时间,单位 s inner_text str None 通过控件内的文字识别控件, xpath暂不支持 text_contains str None 通过控件内的文字模糊匹配控件, xpath暂不支持 value str None 通过控件的 value 识别控件, xpath暂不支持 index int -1 index==-1: 获取所有符合的元素, index>=0: 获取前index+1符合的元素 xpath str None 显式指定xpath, 小程序基础库2.19.5后支持

「Returns:」

  • List[Element]

示例代码如下:

def test_get_elements(self):
    '''
    获取一组元素
    :return:
    '''
    element = self.page._get_elements_by_css("[class='kind-list-text']")
    for el in element:
        print(el.inner_text)

scroll_to()

?

滚动到指定高度

?

「Parameters:」

名称 类型 默认值 说明 scroll_top int Not None 高度,单位 px duration int 300 滚动动画时长,单位 ms

「Returns:」

  • None

示例代码如下:

def test_scroll_to(self):
    '''
    500ms内页面滚动到高度为200px的位置
    :return:
    '''
    page = self.app.navigate_to("/packageComponent/pages/view/scroll-view/scroll-view")
    # 500ms内页面滚动到高度为200px的位置
    page.scroll_to(200, 500)
    time.sleep(1)
    self.assertEqual(page.scroll_y, 200, "scroll success")

wait_for()

?

等待直到指定的条件成立, 条件可以是页面元素, 也可以是自定义的函数或者是需要等待的时间(单位秒)

?

「Parameters:」

名称 类型 默认值 说明 condition int str function max_timeout int 10 超时时间,单位 s

「Returns:」

  • bool

「示例代码如下:」

def test_wait_for(self):
    '''
    5秒内等待页面页面元素出现,返回布尔类型
    :return:
    '''
    self.app.navigate_to("/packageComponent/pages/view/view/view")
    isTrue = self.page.wait_for("[class='flex-item demo-text-2']", max_timeout=5)
    self.assertEqual(True, isTrue, "元素成功加载!")

Element中API的使用

get_element()

?

查找一个元素

?

「Parameters:」

名称 类型 默认值 说明 selector str Not None 选择器 inner_text str None 通过控件内的文字识别控件 text_contains str None 通过控件内的文字模糊匹配控件 value str None 通过控件的 value 识别控件 max_timeout int 0 超时时间,单位 s

「PS: selector 支持的语法:」

  • xpath外,同page.get_element

get_elements()

?

查找一组元素

?

「Parameters:」

名称 类型 默认值 说明 selector str Not None 选择器 max_timeout int 0 超时时间,单位 s inner_text str None 通过控件内的文字识别控件 text_contains str None 通过控件内的文字模糊匹配控件 value str None 通过控件的 value 识别控件 index int -1 index==-1: 获取所有符合的元素, index>=0: 获取前index+1符合的元素

「PS: 支持的css选择器同 get_element()」

「Returns:」

  • List[Element]

示例代码如下:

# 一个元素
element = self.page.get_element("selector")
element = element.get_element("selector")
# 一组元素
elements = self.page.get_elements("selector")
elements = element.get_elements("selector")

attribute()

?

获取元素属性

?

示例代码如下:

def test_attribute(self):
    '''
    获取页面元素属性,返回集合
    :return:
    '''
    self.app.navigate_to("/packageComponent/pages/view/view/view")
    attribute = self.page.get_element("[class='flex-item demo-text-2']").attribute("class")
    print(attribute)
    self.assertEqual(['flex-item demo-text-2'], attribute, "元素成功加载!")

tap()

?

点击元素

?

click()

?

在tap()之前检查元素pointer-events样式是否为none 示例代码如下:

?

# tap
self.page.get_element('view',inner_text='视图容器',max_timeout=2).tap()
# click
self.page.get_element('view',inner_text='视图容器',max_timeout=2).click()

long_press()

?

长按元素

?

示例代码如下:

# 长按操作
e = page.get_element("#testlongtap") e.long_press() 

move()

?

移动元素(触发元素的 touchstart、touchmove、touchend 事件)

?

「Parameters:」

名称 类型 默认值 说明 x_offset int Not None x 方向上的偏移,往右为正数,往左为负数 y_offset int Not None y 方向上的偏移,往下为正数,往上为负数 move_delay int 350 移动前摇,ms smooth bool False 平滑移动


import minium, time
@minium.ddt_class
class TestElement(minium.MiniTest):
    @classmethod
    def setUpClass(cls):
        super(TestElement, cls).setUpClass()
        cls.page = cls.app.redirect_to("/pages/testelement/testelement")

    def _reset_movable_view(self):
        # 重置元素位置
        element = self.page.get_element("movable-view")
        element.move_to(0, 0)
        time.sleep(1)

    def test_move(self):
        """
        测试move方法, movable-view元素横向移动30像素, 纵向移动70像素
        """
        self._reset_movable_view()
        element = self.page.get_element("movable-view")
        rect = element.rect
        element.move(30, 70, 500)  # 横向移动30像素, 纵向移动70像素
        self.assertDictEqual(
            {
                "left": rect["left"] + 30,
                "top": rect["top"] + 70,
                "width": rect["width"],
                "height": rect["height"],
            },
            element.rect,
        )

    def test_move_smooth(self):
        self._reset_movable_view()
        element = self.page.get_element("movable-view")
        rect = element.rect
        element.move(30, 70, 750, smooth=True)
        time.sleep(2)
        self.assertDictEqual(
            {
                "left": rect["left"] + 30,
                "top": rect["top"] + 70,
                "width": rect["width"],
                "height": rect["height"],
            },
            element.rect,
        )

styles()

?

获取元素的样式属性

?

「Parameters:」

名称 类型 默认值 说明 names str list Not None

示例代码如下:

def test_styles(self):
    '''
    获取元素的样式属性
    :return:
    '''
    self.app.navigate_to("/packageComponent/pages/view/view/view")
    attribute = self.page.get_element("[class='flex-item demo-text-2']").styles("color")
    print(attribute)
    self.assertEqual(['rgb(255, 255, 255)'], attribute, "获取元素的样式属性成功!")

scroll_to(

?

元素滚动

?

?

基础库v2.23.4版本后支持

?

「Parameters:」

名称 类型 默认值 说明 top int None x 轴上滚动的距离 left int None y 轴上滚动的距离

示例代码如下:

def test_scroll_to(self):
    '''
    元素滚动
    :return:
    '''
    self.app.navigate_to("/packageComponent/pages/view/view/view")
    x=self.page.scroll_width
    y=self.page.scroll_height
    self.page.get_element('view',inner_text='B').scroll_to(x/2,y/2)

input()

?

input & textarea 组件输入文字

?

?

IDE上不会改变element上的value属性,建议使用变化的Page.data/hook绑定的input方法判断是否生效

?

「Parameters:」

名称 类型 默认值 说明 text str None 输入文本

示例代码如下:

def test_input(self):
    '''
    元素输入操作
    :return:
    '''
    # input框
    self.app.navigate_to("/packageComponent/pages/form/input/input")
    self.page.get_element('[placeholder="最大输入长度为10"]').input("文本内容")
    # textarea输入框
    self.app.navigate_to("/packageComponent/pages/form/textarea/textarea")
    self.page.get_element('.textarea-wrp > textarea').input("文本内容")

写在最后

越写越发现自己的盲区越多,关于小程序的一些组件我还是不太明白,待我去研究明白。后续再来更新,尽量做到通俗易懂,还请各位同学能够继续关注、支持我,有问题欢迎文末留言给我,一起交流学习!

相关推荐

10w qps缓存数据库——Redis(redis缓存调优)

一、Redis数据库介绍:Redis:非关系型缓存数据库nosql:非关系型数据库没有表,没有表与表之间的关系,更不存在外键存储数据的形式为key:values的形式c语言写的服务(监听端口),用来存...

Redis系列专题4--Redis配置参数详解

本文基于windowsX64,3.2.100版本讲解,不同版本默认配置参数不同在Redis中,Redis的根目录中有一个配置文件(redis.conf,windows下为redis.windows....

开源一夏 | 23 张图,4500 字从入门到精通解释 Redis

redis是目前出场率最高的NoSQL数据库,同时也是一个开源的数据结构存储系统,在缓存、数据库、消息处理等场景使用的非常多,本文瑞哥就带着大家用一篇文章入门这个强大的开源数据库——Redis。...

redis的简单与集群搭建(redis建立集群)

Redis是什么?是开源免费用c语言编写的单线程高性能的(key-value形式)内存数据库,基于内存运行并支持持久化的nosql数据库作用主要用来做缓存,单不仅仅是做缓存,比如:redis的计数器生...

推荐几个好用Redis图形化客户端工具

RedisPlushttps://gitee.com/MaxBill/RedisPlusRedisPlus是为Redis可视化管理开发的一款开源免费的桌面客户端软件,支持Windows、Linux...

关于Redis在windows上运行及fork函数问题

Redis在将数据库进行持久化操作时,需要fork一个进程,但是windows并不支持fork,导致在持久化操作期间,Redis必须阻塞所有的客户端直至持久化操作完成。微软的一些工程师花费时间在解决在...

你必须懂的Redis十大应用场景(redis常见应用场景)

Redis作为一款高性能的键值存储数据库,在互联网业务中有着广泛的应用。今天,我们就来详细盘点一下Redis的十大常用业务场景,并附上Golang的示例代码和简图,帮助大家更好地理解和应用Redis。...

极简Redis配置(redis的配置)

一、概述Redis的配置文件位于Redis安装目录下,文件名为redis.conf(Windows名为redis.windows.conf,linux下的是redis.conf)你可以通过C...

什么是redis,怎么启动及如何压测

从今天起咱们一起来学习一下关于“redis监控与调优”的内容。一、Redis介绍Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。...

一款全新Redis UI可视化管理工具,支持WebUI和桌面——P3X Redis UI

介绍P3XRedisUI这是一个非常实用的RedisGUI,提供响应式WebUI访问或作为桌面应用程序使用,桌面端是跨平台的,而且完美支持中文界面。Githubhttps://github....

windows系统的服务器快速部署java项目环境地址

1、mysql:https://dev.mysql.com/downloads/mysql/(msi安装包)2、redis:https://github.com/tporadowski/redis/r...

window11 下 redis 下载与安装(windows安装redis客户端)

#热爱编程是一种怎样的体验#window11下redis下载与安装1)各个版本redis下载(windows)https://github.com/MicrosoftArchive/r...

一款轻量级的Redis客户端工具,贼好用!

使用命令行来操作Redis是一件非常麻烦的事情,我们一般会选用客户端工具来操作Redis。今天给大家分享一款好用的Redis客户端工具TinyRDM,它的界面清新又优雅,希望对大家有所帮助!简介Ti...

一个.NET开发且功能强大的Windows远程控制系统

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍SiMayRemoteMonitorOS是一个基于Windows的远程控制系统,完...

Redis客户端工具详解(4款主流工具)

大家好,我是mikechen。Redis是大型架构的基石,也是大厂最爱考察内容,今天就给大家重点详解4款Redis工具@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集...