Appium(八):Appium API(二) 元素等待、元素操做

1. 元素等待

咱們在使用腳本的時候,可能會因爲網絡、服務器處理、電腦等緣由,咱們想要找的元素沒有加載出來,這個時候若是直接定位就可能會報錯。android

這個時候咱們就能夠設置元素等待了。web

什麼叫元素等待呢?服務器

就是WebDriver定位頁面元素時若是沒有找到,就會在指定時間內一直等待的過程。網絡

元素等待一共分爲兩種類型:顯示等待和隱式等待。app

1.1 隱式等待

隱式等待是將全部定位元素的超時時間設置爲同一個值。函數

在獲取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

咱們能夠看到,若是元素找不到,就會在五秒以後報錯。

1.2 顯示等待

顯示等待就是爲須要等待的元素分別設置不一樣的值。

等待元素加載指定的時長,超出時長拋出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()

1.3 隱式等待和顯示等待的選擇

做用域:

顯式等待爲單個元素有效,隱式爲全局元素

方法:

顯式等待方法封裝在WebDriverWait類中,而隱式等待則直接經過driver實例化對象調用

還有就是sleep的問題,sleep是一個固定的時間,可使用可是不推薦,咱們在正式的使用中,會將sleep方法和其餘方法封裝成函數。

2. 元素操做

2.1 點擊元素 

在須要點擊某個按鈕的時候使用。 

前面已經使用過不少次了,這裏就簡單過一下了。

方法:

element.click() :對element按鈕進行點擊操做

2.2 輸入和清空輸入框內容

須要對輸入框進行輸入或清空的時候使用。

這個前面也使用過了。

方法:

element.send_keys(value):對element輸入框進行輸入操做

element.clear(): 對element輸入框進行清空操做

須要注意的是默認輸入中文無效,可是不會報錯,須要在「啓動代碼」中增長兩個參數。

desired_caps['unicodeKeyboard'] = True

desired_caps['resetKeyboard'] = True 

2.3 獲取元素的文本內容

須要獲取按鈕、文本框、輸入框等控件的文本內容時使用。

這個方法在前面也有使用。

方法:

 element.text:獲取element控件的文本內容

2.4 獲取元素的位置和大小

須要獲取元素的位置和大小的時候使用。

方法:

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()

 

2.5 獲取元素的屬性值

根據特徵定位到元素後,使元素的屬性名獲取對應的屬性值。

方法:

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 才能支持 

相關文章
相關標籤/搜索