騰訊出品小程式自動化測試框架【Minium】系列(五)API詳解(中)

久曲健發表於2023-02-05

寫在前面

又有好久沒更新小程式自動化測試框架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("文字內容")

寫在最後

越寫越發現自己的盲區越多,關於小程式的一些元件我還是不太明白,待我去研究明白。後續再來更新,儘量做到通俗易懂,還請各位同學能夠繼續關注、支援我,有問題歡迎文末留言給我,一起交流學習!

相關文章