Appium获取Toast消息

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设计

相关文章
相关标签/搜索