写在前面
又有好久没更新小程序自动化测试框架Minium系列文章了,主要真的太忙,尽量做到每周一更吧,还请大家能够理解!
上篇文章为大家分享关于Minium
中Minium、App
模块的API
使用,接下来将为大家继续分享Minium
中API
的使用。
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:
- 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("文本内容")
写在最后
越写越发现自己的盲区越多,关于小程序的一些组件我还是不太明白,待我去研究明白。后续再来更新,尽量做到通俗易懂,还请各位同学能够继续关注、支持我,有问题欢迎文末留言给我,一起交流学习!