App測試中,強制等待和隱式等待誰更強?

簡介

添加等待是爲了確保自動化腳本在執行過程中與應用程序之間的同步和穩定性。

應用程序的響應時間是不確定的,可能存在網絡延遲、加載時間、動畫效果等因素。如果在執行自動化腳本時沒有適當的等待機制,腳本可能會在應用程序還未完成相應操作或加載完成之前繼續執行下一步,導致測試失敗或產生不穩定的結果。

通過添加適當的等待操作,可以使腳本在關鍵操作後等待一段時間,以確保應用程序完成相關任務或操作。這可以包括顯式等待(例如等待特定元素出現、消失或可點擊),或隱式等待(在整個腳本執行過程中設置一個全局的等待時間)。

等待操作有助於提高腳本的穩定性,減少因應用程序響應不一致而導致的測試失敗。它還能夠模擬用戶在與應用程序交互時的真實等待時間,提供更真實的測試場景。
因此,在編寫自動化腳本時,考慮添加適當的等待操作是一個重要的實踐,可以提高腳本的可靠性和穩定性,並確保腳本與應用程序之間的同步。

強制等待

  • 解決方案:在報錯的元素操作之前添加等待。
  • 原理:線程休眠一定時間。
  • time.sleep(3)
import time
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait


class TestWait:

    def setup_class(self):
        '''
        完成 capability 設置
        初始化 driver
        :return:
        '''
        # 設置 cpability
        caps = {
            # 設置 app 安裝的平臺(Android,iOS)
            "platformName": "Android",
            # 設置 appium 驅動
            "appium:automationName": "uiautomator2",
            # 設置設備名稱
            "appium:deviceName": "emulator-5554",
            # 設置被測 app 的包名
            "appium:appPackage": "io.appium.android.apis",
            # 設置被測 app 啓動頁面的 Activity
            "appium:appActivity": ".ApiDemos",
            # 不清空緩存信息
            "appium:noReset": True,
            # 首次啓動的時候,不停止app
            "appium:dontStopAppOnReset": True,
            # 跳過安裝,權限設置等操作
            "appium:skipDeviceInitialization": True,
        }

        # 初始化 driver
        self.driver = webdriver.Remote(
            "http://127.0.0.1:4723",
            options=UiAutomator2Options().load_capabilities(caps)
        )

    def teardown_class(self):
        '''
        關閉 driver
        :return:
        '''
        self.driver.quit()

    def test_wait(self):
        '''
        點擊 OS 按鈕後等待 3 秒
        輸入框輸入內容後等待 2 秒
        點擊返回按鈕後等待 2 秒
        :return:
        '''
        # 測試步驟
        # 找到 OS 元素
        el5 = self.driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="OS")
        # 點擊 OS 元素
        el5.click()
        # 等待 3 秒
        time.sleep(3)
        # 找到 Morse Code 元素
        el6 = self.driver.find_element(AppiumBy.ACCESSIBILITY_ID, "Morse Code")
        el6.click()
        # 找到輸入框元素
        el7 = self.driver.find_element(AppiumBy.ID, "io.appium.android.apis:id/text")
        # 在輸入框中輸入內容
        el7.send_keys("ceshiren.com")
        # 等待 2 秒
        time.sleep(2)
        # 點擊返回按鈕
        self.driver.back()
        # 等待 2 秒
        time.sleep(2)
        # 點擊返回按鈕
        self.driver.back()
        # 斷言:判斷首頁中第一個元素的文本內容是 Access'ibility
        result = self.driver.find_element(
            AppiumBy.XPATH,
            "//*[@resource-id='android:id/text1'][1]"
        )
        print(result.text)
        assert result.text == "Access'ibility"

隱式等待

  • 問題:難以確定元素加載的具體等待時間。
  • 解決方案:針對於尋找元素的這個動作,使用隱式等待添加配置。
  • 演練環境:雪球 app。
  • 原理:隱式等待是一種全局的等待方式,設置一個等待時間,輪詢查找(默認 0.5 秒)元素是否出現,如果沒出現就拋出異常。

#設置一個等待時間,輪詢查找(默認0.5秒)元素是否出現,如果沒出現就拋出異常
driver.implicitly_wait(3)

隱式等待無法解決的問題

  • 元素可以找到,使用點擊等操作,出現報錯。

  • 原因:

    • 頁面元素加載是異步加載過程,通常 xml 會先加載完成,相應的元素屬性後加載。
    • 元素存在與否是由 xml 決定,元素的交互是由屬性決定。
    • 隱式等待只關注元素能不能找到,不關注元素能否點擊或者進行其他的交互。
  • 解決方案:使用顯式等待。

顯式等待基本使用

  • 示例:WebDriverWait(driver實例, 最長等待時間, 輪詢時間).until(結束條件)。
  • 原理:在最長等待時間內,輪詢,是否滿足結束條件。
  • 注意:在初級時期,先關注使用。
# 顯示等待 Morse Code 元素可點擊
WebDriverWait(self.driver, 10).until(
    expected_conditions.element_to_be_clickable(
        (AppiumBy.ACCESSIBILITY_ID, "Morse Code")))
# 找到 Morse Code 元素
el6 = self.driver.find_element(AppiumBy.ACCESSIBILITY_ID, "Morse Code")
el6.click()

總結

Appium 提供了三種等待方式,確保測試腳本在執行時與應用程序狀態同步。這些等待分爲強制等待、隱式等待和顯式等待三種。用戶可以根據不同的需求結合使用這些等待方式,以提高測試腳本的穩定性和可靠性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章