Android中的Toast是一種簡易的消息提示框。且通常顯示3s左右的時間就消失。他屬於系統的一種提示,而不是應用上的。因此使用定位元素工具定位是獲取不到Toast元素的。android
定位Toast元素須要藉助UiAutomator2 ,automationName:uiautomator2;因爲他的設計方式,因此在getPageSource 是查找不到的。在定位Toast元素時必須使用xpath定位方式。
使用xpath定位有兩種方法,一種是藉助Toast的className:android.widget.Toast;另外一種是藉助文本內容。因此定位寫法有兩種形式:
driver.find_element_by_xpath("//*[@class='android.widget.Toast']")
driver.find_element_by_xpath("//*[@text='xxxxx']")web
在app UI自動化中,Toast是經常使用的一種文言提示方法。因此對此進行封裝,便於之後調用。app
# coding:utf-8 from appium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def get_toast(driver, text=None, timeout=5, poll_frequency=0.5): """ get toast :param driver: driver :param text: toast text :param timeout: Number of seconds before timing out, By default, it is 5 second. :param poll_frequency: sleep interval between calls, By default, it is 0.5 second. :return: toast """ if text: toast_loc = ("//*[contains(@text, '%s')]" %text) else: toast_loc = "//*[@class='android.widget.Toast']" try: WebDriverWait(driver, timeout, poll_frequency).until(EC.presence_of_element_located(('xpath', toast_loc))) toast_elm = driver.find_element_by_xpath(toast_loc) return toast_elm except: return "Toast not found"
解釋:WebDriverWait(driver, timeout, poll_frequency).until(EC.presence_of_element_located(('xpath', toast_loc)))
在這只是至關於一個頻率執行,在固定的時間中判斷Toast是否存在。固然,若是在初始化driver時設置了driver.implicitly_wait(30),則這兒的查找能夠註釋掉。工具
在這兒這樣設計的目的只是爲了不代碼執行太快或太慢,獲取不到Toast,加強代碼的健壯性而已ui
調用也很簡單,若是是須要判斷Toast是否出現,則只須要判斷 get_toast()爲True。spa
若是要獲取Toast文本,則添加 text,get_toast().text設計