界面監視器¶
監視器用來即時監聽當前顯示器介面的變化並在滿足預設條件時,執行預設的動作如點擊元素、按鍵、亦或是記錄發生次數,您可以將其理解為李跳跳或類似自動跳過廣告的功能底層實作。由於此功能會自動進行點擊或按鍵操作,當需要人工介入時可能會發生非預期的動作,所以請謹慎使用。
小撇步
正常情況下,監視器以及事件註冊應該在指令碼最開始的時候進行,執行過程中一般不會再進行。
啟用監視器¶
下列介面將會啟用界面監視器,預設情況下剛註冊的監視器處於停用/關閉狀態。
注意
在啟用監視器或監視事件之前,介面上發生的任何符合監視條件的變化均不會被自動處理。
d.set_watcher_loop_enabled(True)
取得監視器是否啟用¶
您可以使用下列介面得知當前介面監視器是否處於啟用狀態。
d.get_watcher_loop_enabled()
關閉監視器¶
關閉監視器迴圈後,將不再自動處理已註冊的事件,例如自動點擊等。
d.set_watcher_loop_enabled(False)
注意
註冊過多的監視事件可能會影響系統效能或操作即時性。
移除所有監視器¶
移除所有已套用的監視事件,這樣可以清除之前執行或異常中斷的指令碼所套用的規則。建議每次啟動指令碼前都執行一次,以防止上次執行或異常中斷的指令碼所註冊的事件影響當前的正常處理流程。
d.remove_all_watchers()
取得所有監視器¶
取得所有已註冊的監視器,包括所有狀態(啟用、未啟用的監視器)
>>> d.get_watchers()
[name: "ClickAcceptWhenShowAggrement"
, name: "PressBackWhenHomePageShows"
enabled: true
, name: "RecordElementAppearTimes"
enabled: true
]
>>> d.get_watchers()[0].enabled
False
>>>
取得所有已啟用的監視器¶
取得所有處於已啟用狀態的監視器。
>>> d.get_enabled_watchers( )
[name: "PressBackWhenHomePageShows"
enabled: true
, name: "RecordElementAppearTimes"
enabled: true
]
>>>
註冊點擊事件¶
點擊事件將會在介面出現符合的選擇器時自動進行點擊等操作,例如軟體彈窗如使用協議、更新提示等的自動略過,亦或是某些特定介面的自動點擊等。
注意
在啟用監視器或監視事件之前,介面上發生的任何符合監視條件的變化均不會被自動處理。
d.register_click_target_selector_watcher("ClickAcceptWhenShowAggrement", [Selector(textContains="使用者協議")], Selector(textContains="同意", clickable=True))
提示
第二個參數支援多個 Selector,表示所有 Selector 條件滿足才會進行事件處理。
註冊上述事件後,當介面中出現包含文字 "使用者協議" 的元素時,將自動點擊 "同意" 按鈕。
註冊按鍵事件¶
按鍵事件將會在介面出現符合選擇器時自動進行按鍵操作,如自動返回等,可以自動避免進入某些介面,當然使用點擊事件也可實現同樣的操作。
注意
在啟用監視器或監視事件之前,介面上發生的任何符合監視條件的變化均不會被自動處理。
d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(textContains="個人中心")], Keys.KEY_HOME)
提示
第二個參數支援多個 Selector,表示所有 Selector 條件滿足才會進行事件處理。
註冊上述事件後,當介面中出現包含文字 "個人中心" 的元素時,將自動按下手機的 HOME 鍵。
註冊計數事件¶
計數事件是在介面出現某些符合選擇器的操作時,將計數 + 1,當介面會出現一閃而過的重要資訊時,可以使用此功能來統計是否出現過某些介面或是出現的次數。
注意
在啟用監視器或監視事件之前,介面上發生的任何符合監視條件的變化均不會被自動處理。
d.register_none_op_watcher("RecordElementAppearTimes", [Selector(textContains="好的")])
提示
第二個參數支援多個 Selector,表示所有 Selector 條件滿足才會進行事件處理。
以上事件記錄包含 "好的" 的介面的出現次數,使用下列介面來取得計數事件的觸發次數。
d.get_watcher_triggered_count("RecordElementAppearTimes")
啟用事件¶
事件註冊後,需要啟用才會將其加入到介面監視器迴圈,否則不會套用。
注意
在啟用監視器或監視事件之前,介面上發生的任何符合監視條件的變化均不會被自動處理。
d.set_watcher_enabled("RecordElementAppearTimes", True)
關閉事件¶
您可以呼叫下列介面來讓介面監視器取消監視某個事件。
注意
在啟用監視器或監視事件之前,介面上發生的任何符合監視條件的變化均不會被自動處理。
d.set_watcher_enabled("RecordElementAppearTimes", False)
移除事件¶
從監視器中完全移除一個事件,同時將會從已註冊事件中刪除。
d.remove_watcher(name)
取得是否啟用事件¶
呼叫下列介面來檢查事件是否正確啟用,防止註冊但是沒有啟用的情況。
d.get_watcher_enabled(name)
進階選擇器¶
除了簡單選擇器外,您也可以使用更複雜的選擇器來進行元素匹配,以下範例展示了如何撰寫一個複雜的選擇器。
d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(resourceId="com.android.market:id/v_app_item").child(index=3).sibling(index=2).child(index=2).child()], Keys.KEY_HOME)
範例完整程式碼¶
以下是一個範例程式碼區塊,它啟用了監視器迴圈並且註冊了三種監視器事件。當介面中出現包含 "使用者協議" 的文字時,自動點擊「同意」;當介面中出現包含 "個人中心" 的文字時,立即返回桌面;當介面中出現包含 "好的" 的文字時,記錄該介面出現的次數。
注意
在啟用監視器或監視事件之前,介面上發生的任何符合監視條件的變化均不會被自動處理。
d.remove_all_watchers()
d.set_watcher_loop_enabled(True)
d.register_click_target_selector_watcher("ClickAcceptWhenShowAggrement", [Selector(textContains="使用者協議")],
Selector(textContains="同意", clickable=True))
d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(textContains="個人中心")], Keys.KEY_HOME)
d.register_none_op_watcher("RecordElementAppearTimes", [Selector(textContains="好的")])
d.set_watcher_enabled("ClickAcceptWhenShowAggrement", True)
d.set_watcher_enabled("PressBackWhenHomePageShows", True)
d.set_watcher_enabled("RecordElementAppearTimes", True)