Appium中如何获取Toast内容信息

  • 2019 年 12 月 5 日
  • 笔记

前言

Toast内容获取信息,这是Appium中很经典的问题了。

在两年前也就是2017年3月6号07:22分,我才看到appium1.6.3版本的发布,更新内容为Ios上可以实现Toast的获取,而Windows也就是安卓端,还需要等待,可惜在那会没有Mac本,很遗憾,无法动手尝试,这个问题就一直搁置了,当时还发了个朋友圈记录下当时的心情。如下图:

什么是Toast?

Android中的Toast是一种消息提示弹框,且Toast显示时间有限,一般3秒左右就消失,无法使用定位元素工具定位,且无法被点击操作。

简单理解,就是弹窗提示语,即你操作行为之后给出的提示,比如微信app的登录功能,你输入正确账号,密码,点击登录,会提示正在登录灰色一散而过的信息,如下图:

环境

Windows10

xAppium:1.15.1(10.0支持)

JAVA Client:6.1.0

JAVA:1.8

Android模拟器:7.0

SDK

准备工作

必须命令安装,客户端desktop这种肯定不行,就别试验了,卸载客户端

1、先卸载最新版本的appium

npm unistall -g appium

2、查看电脑中还有没有appium

appium -v

3、如没有,需要npm安装检验appium版本验证

appium -v

如果第二步还存在,说明appium安装到其他目录下了,查看appium路径:which appium,此时可能会输出路径为【/usr/local/bin/appium】,进到这个目录下手动删除appium文件夹,再输入:appium -v,此时应该就没有,提示:zsh: command not found: appium

4、再重新安装appium指定版本

cnpm install -g [email protected]

再输入:appium -v,此时应该就有1.10.0版本提示了

6、安装appium-uiautomator2-driver

cnpm install appium-uiautomator2-driver

安装成功后,可以在下面路径看到对应的文件。

路径:C:UsersAdministratornode_modules

[email protected]@appium-uiautomator2-driver  [email protected]@appium-uiautomator2-server

7、安装两个apk

  • appium-uiautomator2-server-v1.12.0.apk
  • appium-uiautomator2-server-debug-androidTest.apk

去上图目录下,找到这两个apk,安装到手机即可

代码实现

1、初始化中加入如下代码:

capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.ANDROID_UIAUTOMATOR2);

2、定位toast元素

具体示例代码:

import io.appium.java_client.android.AndroidDriver;  import io.appium.java_client.remote.AutomationName;  import io.appium.java_client.remote.MobileCapabilityType;  import org.apache.commons.io.FileUtils;  import org.openqa.selenium.By;  import org.openqa.selenium.OutputType;  import org.openqa.selenium.WebDriver;  import org.openqa.selenium.WebElement;  import org.openqa.selenium.remote.DesiredCapabilities;  import org.openqa.selenium.support.ui.ExpectedCondition;  import org.openqa.selenium.support.ui.ExpectedConditions;  import org.openqa.selenium.support.ui.WebDriverWait;  import org.testng.Assert;  import org.testng.TestNGException;  import org.testng.annotations.AfterClass;  import org.testng.annotations.BeforeClass;  import org.testng.annotations.Test;  import java.io.File;  import java.io.IOException;  import java.net.URL;  import java.util.List;  import java.util.concurrent.TimeUnit;  /**   * @author rongrong   * 获取toast信息   */public class TestGetToast {      AndroidDriver<WebElement> driver;      @BeforeClass(alwaysRun = true)      public void setUp() throws Exception {          DesiredCapabilities capabilities = new DesiredCapabilities();          capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "127.0.0.1:62001");          capabilities.setCapability("platformName", "Android");          capabilities.setCapability("deviceName", "Android Emulator");          // 设置app的主包名和主类名(要启动应用包名和activity)          capabilities.setCapability("appPackage", "com.tencent.mm");          //app包名          capabilities.setCapability("appActivity", "com.tencent.mm.ui.LauncherUI");          //要启动的Android Activity名          capabilities.setCapability("appActivity", ".ui.LauncherUI");          capabilities.setCapability("noReset", true);          capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.ANDROID_UIAUTOMATOR2);          // driver实例          driver = new AndroidDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);          driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);      }      /**       * 登录功能验证       */      @Test      public void testGetToast() {          try {              driver.findElement(By.id("d0v")).click();              driver.findElement(By.id("dc")).click();              pause(1);              driver.findElement(By.id("d0o")).click();              pause(1);              List<WebElement> elements = driver.findElements(By.id("m6"));              elements.get(0).sendKeys("1");              elements.get(1).sendKeys("1");              pause(1);              driver.findElement(By.id("d0p")).click();              WebElement element = new WebDriverWait(driver, 30).until(new ExpectedCondition<WebElement>() {                  public WebElement apply(WebDriver driver) {                      return driver.findElement(By.xpath("//*[contains(@text, '正在')]"));                  }              });              String toast = element.getText();              System.out.println("toast : " + toast);              driver.findElement(By.id("b47")).click();          } catch (AssertionError e) {              Assert.fail(getClass().getName() + " >> " + e.getMessage());          } catch (Exception e) {              throw new TestNGException(getClass().getName() + e.getMessage(), e);          }      }      @AfterClass      public void afterTestStopDriver() {          driver.quit();      }      /**       * 程序暂停几秒       *       * @param i       */      public void pause(int i) {          try {              Thread.sleep(i * 1000);          } catch (InterruptedException e) {              e.printStackTrace();          }      }  }

实现效果