写在前面

又有好久没更新小程序自动化测试框架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:

实例代码如下:

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:

示例代码如下:

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 支持的语法:

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:

示例代码如下:

# 一个元素
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("文本内容")

写在最后

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

最新文章

  1. grub2挂在iso镜像“ /dev/disk/by-label/XXXX error: boot device didn't show up after 30 seconds”问题
  2. [浅学] 1、Node.js尝试_安装&运行第一个helloworld
  3. ODBC接口规范
  4. http 服务
  5. Codeforces 612E - Square Root of Permutation
  6. restrictkeyword
  7. AutoMapper 创建嵌套对象映射(原创)
  8. [置顶] ROS探索总结(十一)——机器视觉
  9. Matlab实用技巧
  10. C# 堆栈(Stack)和队列(Queue)
  11. JMeter 线程组之Stepping Thread Group插件介绍
  12. 2018.4.24 快排查找第K大
  13. 硬件电路io口控制继电器电路
  14. Redis一次数据丢失
  15. hdu4059 The Boss on Mars 容斥原理
  16. POJ 2590
  17. cloudera项目源代码
  18. FTP服务器的配置与实现
  19. MVC各部分技术体现
  20. SpringDaoSupport

热门文章

  1. STF的DOCKER搭建
  2. jquery实现复选框的全选与取消全选功能
  3. RSA、DSA 和 ECC 加密算法有什么区别?
  4. 手把手,完整的从0搭建vite-vue3-ts项目框架:配置less+svg+pinia+vant+axios
  5. php统一的gocheck方法
  6. Go语言核心36讲07
  7. Python调用golang
  8. 【Devexpress】gridcontorl设置某个特定单元格不可编辑
  9. php7怎么安装memcache扩展
  10. 工程坐标转换方法C#代码实现