【小程式自動化Minium】二、元素定位-Page介面中的 get_element() 與 get_elements()
- 2022 年 6 月 30 日
- 筆記
- 微信小程式自動化Minium, 把蘋果咬哭的不規律日常
UI自動化中的重要工作就是元素定位了,高效精準的定位方法可以讓工作事半功倍。
在過去的一段web自動化經歷中,使用的selenium
庫支援了多種定位方法,我們可以利用這些定位方法來做進一步封裝,寫出符合項目更高效的定位器。
一、get_element() 與 get_elements()
那麼在小程式的Minium
框架中,是如何定位元素的呢?先來回歸下上一節中演示用的程式碼:
import minium
class ComponentTest(minium.MiniTest):
def test_ui_op(self):
self.page.get_element("view", inner_text="視圖容器").click()
self.page.get_element(".navigator-text", inner_text="swiper").click()
self.page.get_elements("switch")[0].click()
self.page.get_elements("switch")[1].click()
print("test_ui_op執行測試")
print(self.mini.get_system_info())
程式碼里的get_element
和get_elements
就是框架中Page
介面提供的方法,可以用來獲取元素。
get_element
:在當前頁面查詢控制項, 如果匹配到多個結果, 則返回第一個匹配到的結果get_elements
: 在當前頁面查詢控制項, 並返回一個或者多個結果
顧名思義,get_elements
多加了個s
表示負數,方法返回的是元素element
對象組成的list
,在程式碼里print
出來後是這樣的(手動換行方便查看):
[
<minium.miniprogram.base_driver.element.FormElement object at 0x000002C26893AE50>,
<minium.miniprogram.base_driver.element.FormElement object at 0x000002C26893AAC0>
]
在這2個方法里還存在幾個相同
的參數:
以及一個不同
的參數,這個是get_elements
方法用到的:
二、參數介紹
1.參數:selector
這是一個必填的參數,內容是css選擇器
或以/
或//
開頭的xpath
,定位元素主要也是靠這個參數。
框架支援多種選擇器,示例程式碼中的選擇器就是".navigator-text"
,關於選擇器下一章再詳細介紹。
而關於xpath
,目前看官方介紹是說暫時不支援一些[text()='xxx']
這類xpath條件,目前就先不做優先介紹了,使用CSS選擇器也足夠了。
另外,也可以自行搜索xpath
語法進一步了解,以前在做web ui自動化的時候我是很熱衷於使用xpath
定位的,輔以xpath軸
,定位器寫的很好用。
2.參數:inner_text
非必填參數,默認None
,可以通過控制項內的文字識別控制項。
self.page.get_element("view", inner_text="視圖容器").click()
在示例程式碼中,inner_text="視圖容器"
指的就是小程式上出現的控制項文本內容,很多時候我們可以根據這種特徵進一步幫助定位。
3.參數:text_contains
非必填參數,默認None
,可以通過控制項內的文字模糊匹配控制項。
跟上面的inner_text
參數一樣,只不過這裡可以模糊匹配,也就是說在頁面可以確定文本內容唯一的情況下,這2種寫法是等價的。
self.page.get_element("view", inner_text="視圖容器").click()
self.page.get_element("view", text_contains="圖容").click()
4.參數:value
非必填參數,默認None
,可以通過控制項的 value 識別控制項。
比如這個單選框控制項,可以使用微信開發者工具的選擇元素按鈕,點擊控制項。
通過 value 值來定位的話可以這樣寫:
self.page.get_element("radio", value="radio1").click()
但是這裡一直出現報錯TypeError: 'str' object is not callable
,是在源碼page.py
第319行。
後來我去翻閱了官方issues,找到一個2年前有人提出的問題跟我這個很像,但是官方也沒回復問題關閉了。這裡我也就嘗試修改了一下,才能正常定位。
我重新把這個問題提交了下,如果得到回復屆時再更新出來。
5.參數:max_timeout
默認值是0
,表示超時時間,單位是s
。而在超時之前會每隔一秒重試一次
。
示例中,我修改下定位,使其必然定位不到。那麼加了max_timeout=5
之後,就會等待5s,期間一直定位不到的話,則拋出元素不存在錯誤。
self.page.get_element(".navigator-text", inner_text="form1", max_timeout=5).click()
6.參數:index
默認值為-1
。
index==-1
: 獲取所有符合的元素,index>=0
: 獲取前index+1
符合的元素。
簡單來說,get_elements()
獲取的是元素在一個list
中,注意下列表中索引是從0開始的。
上圖中class為kind-list-item
存在9個元素,現在使用get_elements
獲取前2個元素:
def test_ui_op(self):
print(self.page.get_elements("view.kind-list-item", index=2))
遺憾的是運行結果結束仍然返回了9個元素出來,繼續給官方提了個issues,等待回復吧 T_T。