1. 程式人生 > 其它 >Appium自動化(17):Appium常用操作之等待操作

Appium自動化(17):Appium常用操作之等待操作

等待機制:

  為了保證指令碼的穩定性,有時候需要引入等待時間,等待頁面載入元素後再進行操作,主要有三種等待時間設定方式。

方式一:

sleep():固定等待時間設定,python的time包裡提供了休眠方法sleep,匯入包後就能使用;

sleep()方法以秒為單位,如果超時設定小於1秒,可以使用小數

寫法:time.sleep(2)

程式碼示例:

import time
from appium import webdriver
from appium.webdriver.webdriver import By
from selenium.webdriver.support.wait import
WebDriverWait des = { 'automationName':'appium', 'platformName':'Android', 'platformVersion':'6.0.1', # 填寫android虛擬機器/真機的系統版本號 'deviceName':'MuMu', # 填寫安卓虛擬機器/真機的裝置名稱 'appPackage':'com.sky.jisuanji', # 填寫被測app包名 'appActivity':'.JisuanjizixieActivity', # 填寫被測app的入口 '
udid':'127.0.0.1:7555', # 填寫通過命令列 adb devices 檢視到的udid 'noReset':True, # 是否重置APP 'unicodeKeyboard':True, # 是否支援中文輸入 'resetKeyboard':True, # 是否支援重置鍵盤 'newCommandTimeout':60 # 30秒沒傳送新命令就斷開連線 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des)
# 固定等待 3秒 time.sleep(3)

方式二:(推薦使用)

implicitlyWait():隱式等待是由webdriver提供的超時等待方法,它比 sleep() 方法智慧,sleep()方法只能在一個固定的時間等待,而 implicitlyWait() 可以在一個時間範圍內等待,稱為隱式等待

寫法:driver.implicitly_wait(100)
from appium import webdriver
from appium.webdriver.webdriver import By
from selenium.webdriver.support.wait import WebDriverWait

des = {
    'automationName':'appium',
    'platformName':'Android',
    'platformVersion':'6.0.1',  # 填寫android虛擬機器/真機的系統版本號
    'deviceName':'MuMu',      # 填寫安卓虛擬機器/真機的裝置名稱
    'appPackage':'com.sky.jisuanji',    # 填寫被測app包名
    'appActivity':'.JisuanjizixieActivity',    # 填寫被測app的入口
    'udid':'127.0.0.1:7555',    # 填寫通過命令列 adb devices 檢視到的udid
    'noReset':True,               # 是否重置APP
    'unicodeKeyboard':True,       # 是否支援中文輸入
    'resetKeyboard':True,         # 是否支援重置鍵盤
    'newCommandTimeout':60        # 30秒沒傳送新命令就斷開連線
       }

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des)

# (推薦使用)隱式等待:全域性設定,它只要設定了,那麼下面的程式碼只要包含了 find_element 方法都會產生等待元素的效果
# 等待機制:每隔500ms 在頁面上檢查是否出現該元素,如果在指定的時間內都沒找到,則報錯
driver.implicitly_wait(30)  # 隱式等待
driver.find_element(By.XPATH,'//android.widget.TextView[@text="安全"]').click()
driver.find_element(By.XPATH,'//android.widget.TextView[@text="螢幕鎖定"]').click()

方式三:

WebDriverWait():顯示等待,由webdriver提供,是針對某個元素來設定的等待時間

語法格式如下:

WebDriverWait(driver,timeout,poll_frequency=0.5,ignore_exceptions=None)

driver:WebDriver的驅動程式(IE,火狐,谷歌或遠端)

timeout:最長超時時間,預設以秒為單位

poll_frequency:休眠時間的間隔(步長)時間,預設為0.5秒(即每500毫秒掃描一次頁面)

ignore_exceptions:超時後的異常資訊,預設情況下拋NoSuchElementException異常

寫法:

from selenium.webdriver.support.ui import WebDriverWait

element=WebDriverWait(driver,3).until(lambdax:x.find_element_by_css_selector(div.red_box"))

程式碼示例:

import time
from appium import webdriver
from appium.webdriver.webdriver import By
from selenium.webdriver.support.wait import WebDriverWait

des = {
    'automationName':'appium',
    'platformName':'Android',
    'platformVersion':'6.0.1',  # 填寫android虛擬機器/真機的系統版本號
    'deviceName':'MuMu',      # 填寫安卓虛擬機器/真機的裝置名稱
    'appPackage':'com.sky.jisuanji',    # 填寫被測app包名
    'appActivity':'.JisuanjizixieActivity',    # 填寫被測app的入口
    'udid':'127.0.0.1:7555',    # 填寫通過命令列 adb devices 檢視到的udid
    'noReset':True,               # 是否重置APP
    'unicodeKeyboard':True,       # 是否支援中文輸入
    'resetKeyboard':True,         # 是否支援重置鍵盤
    'newCommandTimeout':60        # 30秒沒傳送新命令就斷開連線
       }

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des)

# 顯示等待:建立一個顯示等待物件  until() 需要一個method作為實參
# 工作機制:預設每隔500ms檢查是否出現該元素,預設值可以通過引數自定義poll_frequency
WebDriverWait(driver,30,0.8).until(lambda dr:dr.find_element_by_xpath('//android.widget.TextView[@text="安全"]'))