一、什么是toast 安卓4。4以上的版本都是基于UiAutomator,现在已经改为UiAutomator2了。所以Toast在原来的UiAutomator基础上没办法识别,没法识别的话就需要利用UiAutomator2了。 如图是V1。10。0,之前的Appium版本中没有看到过它会自动把自动化测试引擎从Appium切换到UiAutomator2,可以去看下启动日志。如果版本低于v1。10。0,版本比较旧的话,应该是没有这种提示信息的。 所以在很多版本当中,如果我们要用Toast,我们就需要指明一个东西:那就是自动化测试引擎必须指明为UiAutomator2。不然它默认就不用这个,必须自己指明。但是现在已经做了改革了,会自动切换为UiAutomator2。 automationName是我们的desiredcaps当中明确要指明的。如果想要获取到Toast也是有要求的。 Toast是什么? UiAutomatorViewer是抓不到它的。即使截屏截到了,用元素定位也是定位不到的。所以用正常套路是搞不定它的。 进行提示作用,且时间出现得非常短。基本上在所有的手机当中都是这种效果(包括验证码、或者注册提示)。验证码提示,你也只能看着它,深灰色的背景,你不能点击确定、取消,没有你可以选项的地方也没有你可以输入的地方。这个才叫做Toast,因为长得比较别致,UiAutomatorViewer找不着它。二、获取Toast提示信息的前提1。针对这种元素,有的时候我们需要做什么呢? 我们想要判断一下这样的Toast有没有出现,一般这样的Toast是带有文字的。如果弹出的是个空白的Toast是没有意义的,那么你就可以提Bug了。所以Toast里面都是有内容的。 那这样的Toast怎么获取呢? 既然不支持UiAutomator,但是又有文字。就只能用一种方式来获取,那就是xpath。通过文本匹配来获取(文本的全部匹配和部分匹配都是可以的)。 你要获取这样的Toast,证明它是存在的,就要有一些前置条件。2。要获取Toast信息要满足以下四个要求:Appiumserver版本1。6。3才支持Toast获取。(而AppiumServer1。6。3没有可视化界面,解决方案:下载AppiumdesktopSetup1。4。1ia32。exe)。代码中必须指定automationName为:UIAutomator2UIAutomator2只支持安卓版本5。0 因此,因为他们的最高支持安卓版本为4。4。2,可以使用genymotion模拟器。要求安装jdk1。864位及以上。配置其环境变量JAVAHOME和path。3。怎么看Server版本? Server版本就是这个v1。18。0: 4。如果AppiumServer版本低于1。6。3,代码中必须指定automationName为UIAutomator2 desiredcaps〔automationName〕UiAutomator2 否则Toast是找不到的。三、4点需要注意的事情 习惯性的操作是要等到元素可见之后,我们才会去操作它。新的东西出来,我们的习惯都是等到它可见之后再去操作。因为它的时间非常短,所以间隔轮循周期做的非常短。 接下来需要做Toast的获取,根据文本匹配,是通过xpath匹配。下面是需要注意的事情:1。在我们等待元素可见的时候,不要用visibilityofelementlocated,因为它对Toast的可见处理并不支持,会直接报错命令无法执行。 也就是等待的时候,要用元素存在的条件。不能用元素可见的条件。 driverWait方法中,请用presenceofelementlocated。它存在了就行了,存在了之后再去处理它。2。选取部分内容匹配需注意 点击click后出来文本要是手机号码或者密码不为空。有时候觉得文本太长了,不想全部匹配。只想通过手机号码这个文本匹配来找到它。 可以,但是选取部分内容的时候要注意下:除了xpath之外,页面上其它元素有没有文本也是手机号码的。 用这种xpath匹配手机号码的话,优先匹配的是别人。不一定是你想匹配的手机号码或密码不能为空了。3。没有找到匹配的Toast 等到这执行的时候,人家早就消失了。等待的时候,人家早就消失了,那怎么办呢? 只能是缩短时间或者不等待,直接去获取一下。图中,已经在执行,但是人家已经消失了。Toast这个问题有些尴尬,如果特别需要Toast上面的消息怎么办?可以求助开发,帮你稍微延长一点时间。 有时能找到Toast,有时找不到,这里是概率性的问题。目前对于Toast只有这一种获取方式。4。Toast获取跟Appium的版本有关 还有一个问题,Toast获取的时候提示你应用的一些页签啊没有通过,这个也是跟Appium的版本有关。Toast这块的问题是比较多的。 如果没有UIAutomator2是绝对会失败,即便你看到它出现了也一定会失败。Server1。9的时候获取Toast是没有问题的。四、Toast提示信息获取 xpath表达式是固定的,现在主要用的方式是文本匹配(部分、全部都可以)。那这个表达式就是双斜杠(相对定位)。 xpath〔contains(text,部分文本内容)〕 这个表达式是固定的。只要把toast对应的文本信息替换下就可以了。获取toast内容是否出现deftoastexist(self,toastmessage):toastloc(xpath,〔contains(text,s)〕toastmessage)try:WebDriverWait(self。driver,5,0。2)。until(EC。presenceofelementlocated(toastloc))获取文本内容driver。findelementbyxpath(toastloc)。textreturnTrueexcept:returnFalse五、代码fromappiumimportwebdriverfromtimeimportsleepfromselenium。webdriver。support。waitimportWebDriverWaitfromselenium。webdriver。supportimportexpectedconditionsasECfromappium。webdriver。common。mobilebyimportMobileBydesiredcaps{}自动化测试引擎desiredcaps〔automationName〕UiAutomator2平台类型desiredcaps〔platformName〕Android平台版本号desiredcaps〔platformVersion〕10设备名称desiredcaps〔deviceName〕2NSDU20410017297app包名desiredcaps〔appPackage〕输入appPackageapp入口acitivitydesiredcaps〔appActivity〕输入activity连接Appiumserver。前提:appiumdesktop要启动。有监听端口。将desiredcaps发送给appiumserver。打开appdriverwebdriver。Remote(http:127。0。0。1:4723wdhub,desiredcaps)运行代码之前:1。appiumserver启动成功。处于监听状态2。模拟器真机必须能够被电脑识别。即adbdevices能够识别到要操作的设备。点击我的WebDriverWait(driver,20)。until(EC。visibilityofelementlocated((MobileBy。ID,com。lemon。lemonban:idnavigationmy)))driver。findelementbyid(com。lemon。lemonban:idnavigationmy)。click()点击我的头像WebDriverWait(driver,20)。until(EC。visibilityofelementlocated((MobileBy。ID,com。lemon。lemonban:idfragmentmylemonavatarlayout)))driver。findelementbyid(com。lemon。lemonban:idfragmentmylemonavatarlayout)。click()点击手机密码登录WebDriverWait(driver,20)。until(EC。visibilityofelementlocated((MobileBy。ID,com。lemon。lemonban:idbtnlogin)))driver。findelementbyid(com。lemon。lemonban:idbtnlogin)。click()1。xpath表达式、文本匹配loc〔contains(text,{})〕。format(手机号码或密码)等待的时候,要用元素存在的条件。不能用元素可见的条件。try:WebDriverWait(driver,10,0。01)。until(EC。presenceofelementslocated((MobileBy。XPATH,loc)))上限10秒就够了,确认toast在页面上存在的时候大概是多久,它都没有0。5秒,你去间隔0。5,可能消失了,你还只留在这。print(driver。findelementbyxpath(loc)。text)except:print(没有找到匹配的toast!!!!)