找回密码
 立即注册

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

匿名  发表于 2023-3-30 10:54:28 阅读模式 打印 上一主题 下一主题
写在前面

又有很久没更新小法式自动化测试框架「Minium」系列文章了,首要真的太忙,只管做到每周一更吧,还请大师可以了解!
上篇文章为大师分享关于Minium中Minium、App模块的API 利用,接下来将为大师继续分享Minium中API的利用。
Page中API的利用

data
当前页面数据, 可间接赋值
  1. Page({
  2.     data: {"testdata1": 1}
  3. })
复制代码
「示例代码以下:」
  1. def test_data(self):
  2.     """
  3.     data演示数据
  4.     :return:
  5.     """
  6.     self.app.navigate_to("/packageComponent/pages/view/view/view")
  7.     page = self.app.get_current_page()
  8.     data = page.data
  9.     self.assertDictEqual({'theme': 'light'}, data)
  10.     data["theme"] = "red"
  11.     page.data = data
  12.     page.data = {"theme1": "light1"}
  13.     page = self.app.get_current_page()
  14.     print(page.data)
  15.     self.assertDictEqual({'theme': 'red', 'theme1': 'light1'}, page.data)
复制代码
element_is_exists()
在当前页面查询元素能否存在
「Parameters:」
称号范例默许值说明
selectorstrNot Nonecss挑选器或以/或//开首的xpath
max_timeoutint10超不时候,单元 s
inner_textstrNone经过控件内的笔墨识别控件
text_containsstrNone经过控件内的笔墨模糊婚配控件
valuestrNone经过控件的 value 识别控件
xpathstrNone显式指定xpath
「示例代码以下:」
  1. def test_element_is_exists(self):
  2.     """
  3.     考证在当前页面元素能否存在
  4.     :return:
  5.     """
  6.     self.app.navigate_to("/packageComponent/pages/view/view/view")
  7.     is_exists = self.page.element_is_exists("view", inner_text="B", max_timeout=5)
  8.     self.assertEqual(True, is_exists," 在当前页面元素存在")
复制代码
get_element()
获得页面元素
「Parameters:」
称号范例默许值说明
selectorstrNot NoneCSS挑选器或以/或//开首的XPath
inner_textstrNone经过控件内的笔墨识别控件
text_containsstrNone经过控件内的笔墨模糊婚配控件
valuestrNone经过控件的 value 识别控件
max_timeoutint0超不时候,单元 s
xpathstrNone显式指定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
实例代码以下:
  1. def test_get_element(self):
  2.     '''
  3.     获得页面当前元素
  4.     :return:
  5.     '''
  6.     self.app.navigate_to("/packageComponent/pages/view/view/view")
  7.     element = self.page.get_element("view",inner_text="A", max_timeout=5)
  8.     print(element.inner_text)
  9.     print(element.inner_wxml)
复制代码
get_elements()
获得一组元素
「PS: 支持的挑选器同 get_element()」
「Parameters:」
称号范例默许值说明
selectorstrNot Nonecss挑选器或以/或//开首的xpath
max_timeoutint0超不时候,单元 s
inner_textstrNone经过控件内的笔墨识别控件, xpath暂不支持
text_containsstrNone经过控件内的笔墨模糊婚配控件, xpath暂不支持
valuestrNone经过控件的 value 识别控件, xpath暂不支持
indexint-1index==-1: 获得一切合适的元素, index>=0: 获得前index+1合适的元素
xpathstrNone显式指定xpath, 小法式根本库2.19.5后支持
「Returns:」

  • List[Element]
示例代码以下:
  1. def test_get_elements(self):
  2.     '''
  3.     获得一组元素
  4.     :return:
  5.     '''
  6.     element = self.page._get_elements_by_css("[class='kind-list-text']")
  7.     for el in element:
  8.         print(el.inner_text)
复制代码
scroll_to()
转动到指定高度
「Parameters:」
称号范例默许值说明
scroll_topintNot None高度,单元 px
durationint300转动动画时长,单元 ms
「Returns:」

  • None
示例代码以下:
  1. def test_scroll_to(self):
  2.     '''
  3.     500ms内页面转动到高度为200px的位置
  4.     :return:
  5.     '''
  6.     page = self.app.navigate_to("/packageComponent/pages/view/scroll-view/scroll-view")
  7.     # 500ms内页面转动到高度为200px的位置
  8.     page.scroll_to(200, 500)
  9.     time.sleep(1)
  10.     self.assertEqual(page.scroll_y, 200, "scroll success")
复制代码
wait_for()
期待直到指定的条件建立, 条件可所以页面元素, 也可以是自界说的函数大概是需要期待的时候(单元秒)
「Parameters:」
称号范例默许值说明
conditionintstrfunction
max_timeoutint10超不时候,单元 s
「Returns:」

  • bool
「示例代码以下:」
  1. def test_wait_for(self):
  2.     '''
  3.     5秒内期待页面页面元素出现,返回布尔范例
  4.     :return:
  5.     '''
  6.     self.app.navigate_to("/packageComponent/pages/view/view/view")
  7.     isTrue = self.page.wait_for("[class='flex-item demo-text-2']", max_timeout=5)
  8.     self.assertEqual(True, isTrue, "元素成功加载!")
复制代码
Element中API的利用

get_element()
查找一个元素
「Parameters:」
称号范例默许值说明
selectorstrNot None挑选器
inner_textstrNone经过控件内的笔墨识别控件
text_containsstrNone经过控件内的笔墨模糊婚配控件
valuestrNone经过控件的 value 识别控件
max_timeoutint0超不时候,单元 s
「PS: selector 支持的语法:」

  • 除xpath外,同page.get_element
get_elements()
查找一组元素
「Parameters:」
称号范例默许值说明
selectorstrNot None挑选器
max_timeoutint0超不时候,单元 s
inner_textstrNone经过控件内的笔墨识别控件
text_containsstrNone经过控件内的笔墨模糊婚配控件
valuestrNone经过控件的 value 识别控件
indexint-1index==-1: 获得一切合适的元素, index>=0: 获得前index+1合适的元素
「PS: 支持的css挑选器同 get_element()」
「Returns:」

  • List[Element]
示例代码以下:
  1. # 一个元素
  2. element = self.page.get_element("selector")
  3. element = element.get_element("selector")
  4. # 一组元素
  5. elements = self.page.get_elements("selector")
  6. elements = element.get_elements("selector")
复制代码
attribute()
获得元素属性
示例代码以下:
  1. def test_attribute(self):
  2.     '''
  3.     获得页面元素属性,返回调集
  4.     :return:
  5.     '''
  6.     self.app.navigate_to("/packageComponent/pages/view/view/view")
  7.     attribute = self.page.get_element("[class='flex-item demo-text-2']").attribute("class")
  8.     print(attribute)
  9.     self.assertEqual(['flex-item demo-text-2'], attribute, "元素成功加载!")
复制代码
tap()
点击元素
click()
在tap()之前检查元素pointer-events款式能否为none 示例代码以下:
  1. # tap
  2. self.page.get_element('view',inner_text='视图容器',max_timeout=2).tap()
  3. # click
  4. self.page.get_element('view',inner_text='视图容器',max_timeout=2).click()
复制代码
long_press()
长按元素
示例代码以下:
  1. # 长按操纵
  2. e = page.get_element("#testlongtap") e.long_press()
复制代码
move()
移动元素(触发元素的 touchstart、touchmove、touchend 事务)
「Parameters:」
称号范例默许值说明
x_offsetintNot Nonex 偏向上的偏移,往右为正数,往左为负数
y_offsetintNot Noney 偏向上的偏移,往下为正数,往上为负数
move_delayint350移动前摇,ms
smoothboolFalse平滑移动
  1. import minium, time
  2. @minium.ddt_class
  3. class TestElement(minium.MiniTest):
  4.     @classmethod
  5.     def setUpClass(cls):
  6.         super(TestElement, cls).setUpClass()
  7.         cls.page = cls.app.redirect_to("/pages/testelement/testelement")
  8.     def _reset_movable_view(self):
  9.         # 重置元素位置
  10.         element = self.page.get_element("movable-view")
  11.         element.move_to(0, 0)
  12.         time.sleep(1)
  13.     def test_move(self):
  14.         """
  15.         测试move方式, movable-view元素横向移动30像素, 纵向移动70像素
  16.         """
  17.         self._reset_movable_view()
  18.         element = self.page.get_element("movable-view")
  19.         rect = element.rect
  20.         element.move(30, 70, 500)  # 横向移动30像素, 纵向移动70像素
  21.         self.assertDictEqual(
  22.             {
  23.                 "left": rect["left"] + 30,
  24.                 "top": rect["top"] + 70,
  25.                 "width": rect["width"],
  26.                 "height": rect["height"],
  27.             },
  28.             element.rect,
  29.         )
  30.     def test_move_smooth(self):
  31.         self._reset_movable_view()
  32.         element = self.page.get_element("movable-view")
  33.         rect = element.rect
  34.         element.move(30, 70, 750, smooth=True)
  35.         time.sleep(2)
  36.         self.assertDictEqual(
  37.             {
  38.                 "left": rect["left"] + 30,
  39.                 "top": rect["top"] + 70,
  40.                 "width": rect["width"],
  41.                 "height": rect["height"],
  42.             },
  43.             element.rect,
  44.         )
复制代码
styles()
获得元素的款式属性
「Parameters:」
称号范例默许值说明
namesstrlistNot None
示例代码以下:
  1. def test_styles(self):
  2.     '''
  3.     获得元素的款式属性
  4.     :return:
  5.     '''
  6.     self.app.navigate_to("/packageComponent/pages/view/view/view")
  7.     attribute = self.page.get_element("[class='flex-item demo-text-2']").styles("color")
  8.     print(attribute)
  9.     self.assertEqual(['rgb(255, 255, 255)'], attribute, "获得元素的款式属性成功!")
复制代码
scroll_to(
元素转动

根本库v2.23.4版本后支持
「Parameters:」
称号范例默许值说明
topintNonex 轴上转动的间隔
leftintNoney 轴上转动的间隔
示例代码以下:
  1. def test_scroll_to(self):
  2.     '''
  3.     元素转动
  4.     :return:
  5.     '''
  6.     self.app.navigate_to("/packageComponent/pages/view/view/view")
  7.     x=self.page.scroll_width
  8.     y=self.page.scroll_height
  9.     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:」
称号范例默许值说明
textstrNone输入文本
示例代码以下:
  1. def test_input(self):
  2.     '''
  3.     元素输入操纵
  4.     :return:
  5.     '''
  6.     # input框
  7.     self.app.navigate_to("/packageComponent/pages/form/input/input")
  8.     self.page.get_element('[placeholder="最大输入长度为10"]').input("文本内容")
  9.     # textarea输入框
  10.     self.app.navigate_to("/packageComponent/pages/form/textarea/textarea")
  11.     self.page.get_element('.textarea-wrp > textarea').input("文本内容")
复制代码
写在最初

越写越发现自己的盲区越多,关于小法式的一些组件我还是不太大白,待我去研讨大白。后续再来更新,只管做到浅显易懂,还请列位同学可以继续关注、支持我,有题目接待文末留言给我,一路交换进修!
回复

使用道具

大神点评

exodus_xt 2023-3-30 10:55:27 显示全部楼层
这不是magicApi 吗  [猎奇]
回复

使用道具 举报

说点什么

您需要登录后才可以回帖 登录 | 立即注册
HOT • 推荐

神回复

站长姓名:王殿武 杭州共生网络科技 创始人 云裂变新零售系统 创始人 飞商人脉对接平台 创始人 同城交友聚会平台 创始人 生活经验分享社区 创始人 合作微信:15924191378(注明来意)