腾讯出品小程序自动化测试框架【Minium】系列(五)API详解(中)

写在前面

又有好久没更新小程序自动化测试框架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("文本内容") 

写在最后

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

发表评论

相关文章