咱們在使用腳本的時候,可能會因爲網絡、服務器處理、電腦等緣由,咱們想要找的元素沒有加載出來,這個時候若是直接定位就可能會報錯。android
這個時候咱們就能夠設置元素等待了。web
什麼叫元素等待呢?服務器
就是WebDriver定位頁面元素時若是沒有找到,就會在指定時間內一直等待的過程。網絡
元素等待一共分爲兩種類型:顯示等待和隱式等待。app
隱式等待是將全部定位元素的超時時間設置爲同一個值。函數
在獲取driver對象後,使用driver調用implicitly_wait方法便可。ui
實例:spa
在5秒鐘內,《設置》中的「返回」按鈕,若是找到則點擊,若是找不到則觀察對應的錯誤信息。3d
# coding:utf-8 from appium import webdriver from time import sleep # 初始化 desired_caps = {} # 使用哪一種移動平臺 desired_caps['platformName'] = 'Android' # Android版本 desired_caps['platformVersion'] = '5.1.1' #使用adb devices -l 查詢,當有多臺設備時,須要聲明 desired_caps['deviceName'] = '127.0.0.1:62001' #包名 desired_caps['appPackage'] = 'com.android.settings' #界面名 desired_caps['appActivity'] = '.Settings' #不清除數據 desired_caps['noReset'] = 'True' # 啓動服務 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) driver.implicitly_wait(5) # driver.find_element_by_id('com.android.settings:id/search').click() search_button = driver.find_element_by_xpath("//*[contains(@content-desc,'收起')]") search_button.click() #退出driver driver.quit()
而後咱們先將註釋的代碼取消註釋,再運行程序。code
咱們能夠看到,若是元素找不到,就會在五秒以後報錯。
顯示等待就是爲須要等待的元素分別設置不一樣的值。
等待元素加載指定的時長,超出時長拋出TimeoutException異常。
方法:
WebDriverWait(driver, timeout, poll_frequency=0.5):參數分別是驅動對象、超時時長、檢測間隔時間,檢測間隔時間默認是0.5秒。
wait.until(method):參數爲lambda查找元素表達式。
須要導入的文件:
from selenium.webdriver.support.wait import WebDriverWait
實例:
在5秒鐘內,每1秒在《設置》中的「返回」按鈕,若是找到則點擊,若是找不到則觀察對應錯誤信息。
# coding:utf-8 from appium import webdriver from time import sleep from selenium.webdriver.support.wait import WebDriverWait # 初始化 desired_caps = {} # 使用哪一種移動平臺 desired_caps['platformName'] = 'Android' # Android版本 desired_caps['platformVersion'] = '5.1.1' #使用adb devices -l 查詢,當有多臺設備時,須要聲明 desired_caps['deviceName'] = '127.0.0.1:62001' #包名 desired_caps['appPackage'] = 'com.android.settings' #界面名 desired_caps['appActivity'] = '.Settings' #不清除數據 desired_caps['noReset'] = 'True' # 啓動服務 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) driver.implicitly_wait(5) driver.find_element_by_id('com.android.settings:id/search').click() #第一種 wait = WebDriverWait(driver, 25, 5) back_button = wait.until(lambda x: x.find_element_by_xpath("//*[@content-desc='收起']")) back_button.click() #第二種 # back_button = WebDriverWait(driver, 5, 1).until(lambda x: x.find_element_by_xpath("//*[@content-desc='收起']")) # back_button.click() #第三種 # WebDriverWait(driver, 5, 1).until(lambda x: x.find_element_by_xpath("//*[@content-desc='收起']")).click() #退出driver driver.quit()
做用域:
顯式等待爲單個元素有效,隱式爲全局元素
方法:
顯式等待方法封裝在WebDriverWait類中,而隱式等待則直接經過driver實例化對象調用
還有就是sleep的問題,sleep是一個固定的時間,可使用可是不推薦,咱們在正式的使用中,會將sleep方法和其餘方法封裝成函數。
在須要點擊某個按鈕的時候使用。
前面已經使用過不少次了,這裏就簡單過一下了。
方法:
element.click() :對element按鈕進行點擊操做
須要對輸入框進行輸入或清空的時候使用。
這個前面也使用過了。
方法:
element.send_keys(value):對element輸入框進行輸入操做
element.clear(): 對element輸入框進行清空操做
須要注意的是默認輸入中文無效,可是不會報錯,須要在「啓動代碼」中增長兩個參數。
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
須要獲取按鈕、文本框、輸入框等控件的文本內容時使用。
這個方法在前面也有使用。
方法:
element.text:獲取element控件的文本內容
須要獲取元素的位置和大小的時候使用。
方法:
element.location:獲取element的位置
element.size:獲取element的大小
實例:
查看《設置》中「放大鏡」的位置和大小。
# coding:utf-8 from appium import webdriver from time import sleep # 初始化 desired_caps = {} # 使用哪一種移動平臺 desired_caps['platformName'] = 'Android' # Android版本 desired_caps['platformVersion'] = '5.1.1' #使用adb devices -l 查詢,當有多臺設備時,須要聲明 desired_caps['deviceName'] = '127.0.0.1:62001' #包名 desired_caps['appPackage'] = 'com.android.settings' #界面名 desired_caps['appActivity'] = '.Settings' # 啓動服務 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) search_button = driver.find_element_by_id("com.android.settings:id/search") print(search_button.location) print(search_button.size) #退出driver driver.quit()
根據特徵定位到元素後,使元素的屬性名獲取對應的屬性值。
方法:
element.get_attribute(value):獲取元素的屬性,傳入值爲想要獲取的屬性名。
實例:
得到《設置》中全部resource-id爲「com.android.settings:id/title」的元素的enabled、text、contenet-desc、resource-id、class的屬性值。
# coding:utf-8 from appium import webdriver from time import sleep # 初始化 desired_caps = {} # 使用哪一種移動平臺 desired_caps['platformName'] = 'Android' # Android版本 desired_caps['platformVersion'] = '5.1.1' #使用adb devices -l 查詢,當有多臺設備時,須要聲明 desired_caps['deviceName'] = '127.0.0.1:62001' #包名 desired_caps['appPackage'] = 'com.android.settings' #界面名 desired_caps['appActivity'] = '.Settings' # 啓動服務 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) titles = driver.find_elements_by_id("com.android.settings:id/title") for title in titles: print(title.get_attribute("enabled")) print(title.get_attribute("text")) print(title.get_attribute("name")) print(title.get_attribute("resourceId")) print(title.get_attribute("ClassName")) #退出driver driver.quit()
value='text' 返回text的屬性值
value='name' 返回content-desc / text屬性值
value='className' 返回 class屬性值,只有 API=>18 才能支持
value='resourceId' 返回 resource-id屬性值,只有 API=>18 才能支持