寫在前面
又有好久沒更新小程式自動化測試框架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("文字內容")
寫在最後
越寫越發現自己的盲區越多,關於小程式的一些元件我還是不太明白,待我去研究明白。後續再來更新,儘量做到通俗易懂,還請各位同學能夠繼續關注、支援我,有問題歡迎文末留言給我,一起交流學習!