App自動化測試:高階控制元件互動技巧

霍格沃兹测试开发学社發表於2024-04-01

簡介

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 用法

  • 滑動解鎖示例

相關文章