簡介
APP 的控制元件元素不僅涵蓋了基礎使用者介面操作,還包括使用者與應用程式中更復雜、功能豐富的空間之間的互動。這種互動遠不止於簡單的按鈕或輸入框。透過藉助 Appium 的 Actions,能夠完成對應用程式進行手勢識別的互動。這意味著可以透過各種手勢,如滑動、縮放、長按等,實現更靈活、直觀的使用者體驗。這種高階互動使得應用程式更具互動性和吸引力,為使用者提供了更深入參與應用功能的途徑。
Actions 介紹
Actions 是 Appium 中的關鍵類,專門設計用於執行各種手勢和互動操作,包括但不限於點選、滑動、長按等。這個類的存在使得在移動端應用程式的自動化測試中,透過 Appium 可以輕鬆地控制裝置活模擬器執行多樣化的手勢操作,透過 Actions ,測試人員可以模擬使用者真實的操作行為,確保應用在不同互動場景下的穩定性和可靠性。這一功能對於移動應用的全面測試和質量保證至關重要。
ActionChains 和 Actions 區別
ActionChains 是 Selenium WebDriver 中的一個類,可用於執行一系列的操作,如滑鼠懸停、拖放、按下鍵盤等。
而 Actions 是 Appium 中的一個類,用於執行手勢和互動操作,如點選、滑動、長按等。
儘管兩者的名稱相似,但它們是針對不同的自動化測試環境而設計的。
ActionChains 適用於網頁自動化測試,透過 Selenium WebDriver 控制瀏覽器執行各種互動操作,並提供了一系列方法來模擬使用者的行為。
而 Actions 則適用於移動端應用程式的自動化測試,透過 Appium 控制裝置或模擬器執行各種手勢操作。
除了適用於不同的自動化測試環境之外, ActionChains 和 Actions 的用法和語法也略有不同。在 Selenium WebDriver 中使用 ActionChains 時,可以透過鏈式呼叫方法來執行一系列操作,並使用 perform() 方法來觸發操作的執行。而在 Appium 中使用 Actions 時,需要建立 TouchAction 物件,並使用其提供的方法來執行手勢操作,並使用 perform() 方法來觸發手勢的執行。
Actions 用法
在使用 ActionChains 進行使用者互動自動化時,首先需要匯入 ActionChains 類以及其他相關模組,然後定義一個 ActionChains 例項,並將 driver 傳入。之後,可以透過定義輸入源和具體的動作來實現各種使用者互動操作。
-
匯入 ActionChains 類及其他模組
-
定義 ActionChains 例項 'actions',傳入 driver
-
定義輸入源
-
定義動作
-
執行動作
滑動解鎖示例
- 安裝手勢密碼鎖 app(TouchAction.apk)
- 開啟應用
- 點選【設定手勢】
- 完成手勢操作(如圖)
實現手勢滑動時,通常需要結合座標,並可透過設定裝置的輸入選項,從介面中找到具體的座標點。
手勢滑動路徑如下圖所示:
Python 版本
class TestActionChains:
def setup_class(self):
# 設定啟動引數
caps = {
"platformName": "Android",
"appium:appPackage": "cn.kmob.screenfingermovelock",
"appium:appActivity": "com.samsung.ui.FlashActivity",
"appium:noReset": True,
"appium:shouldTerminateApp": True,
}
# 初始化 driver
self.driver = webdriver.Remote('http://localhost:4723', options=UiAutomator2Options().load_capabilities(caps))
# 設定隱式等待
self.driver.implicitly_wait(15)
def teartdown_class(self):
# 退出應用程式
self.driver.quit()
def test_slide_to_unlock(self):
# 點選設定手勢
self.driver.find_element(by=AppiumBy.ID, value="cn.kmob.screenfingermovelock:id/patternTxt").click()
print(self.driver.get_window_size())
# 定義ActionChains例項
actions = ActionChains(self.driver)
# 定義輸入源
actions.w3c_actions = ActionBuilder(self.driver, mouse=PointerInput(interaction.POINTER_TOUCH, "touch"))
# 定義動作 pointer_down按下 pause暫停 release釋放
# 需要實現3個點之間的滑動,A->B 水平滑動 B—>C 豎直滑動
bounds = self.driver.find_element(AppiumBy.ID, 'cn.kmob.screenfingermovelock:id/patternView').get_attribute(
'bounds')
actions.w3c_actions.pointer_action.move_to_location(204, 377)
actions.w3c_actions.pointer_action.pointer_down()
actions.w3c_actions.pointer_action.move_to_location(930, 373)
# 停頓0.5s 模擬在兩個點之間進行拖拽操作
actions.w3c_actions.pointer_action.pause(0.5)
actions.w3c_actions.pointer_action.move_to_location(846, 1150)
actions.w3c_actions.pointer_action.pause(0.5)
actions.w3c_actions.pointer_action.release()
# 執行操作
actions.perform()
# 獲取【繼續】按鈕的 clickable 屬性值
result = self.driver.find_element(AppiumBy.ID, "cn.kmob.screenfingermovelock:id/btnTwo").get_attribute(
"clickable")
# 斷言【繼續按鈕】可點選
assert result == "true"
總結
-
Actions 用法
-
滑動解鎖示例