Appium自動化(17):Appium常用操作之等待操作
阿新 • • 發佈:2021-10-16
等待機制:
為了保證指令碼的穩定性,有時候需要引入等待時間,等待頁面載入元素後再進行操作,主要有三種等待時間設定方式。
方式一:
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 importWebDriverWait 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="安全"]'))