前言

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

什么是Toast?

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

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

环境(win10系统)

  • Appium:1.15.1
  • 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 appium@1.10.

ps:没错,就是1.10.0版本的好用,降版本操作

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

6、安装appium-uiautomator2-driver

cnpm install appium-uiautomator2-driver

安装成功后可以在 C:\Users\Administrator\node_modules看到对应的文件:

_appium-uiautomator2-driver@1.12.0@appium-uiautomator2-driver
_appium-uiautomator2-server@1.10.0@appium-uiautomator2-server

7、安装appium-uiautomator2-server-v1.12.0.apk、appium-uiautomator2-server-debug-androidTest.apk

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

代码实现

  • 初始化中加入如下代码:
   capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.ANDROID_UIAUTOMATOR2);
  • 定位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();
}
}
}

实现效果:

 

appium+java(八)获取Toast内容信息的更多相关文章

  1. appium获取Toast内容的方法

    做自动化测试的时候,可能需要根据弹出的Toast提示来做下一步判断.这里记录一下获取Toast内容的方法,同时巩固一下显示等待的方法之一WebDriverWait. from selenium.web ...

  2. java提取(获取)博客信息(内容)

    package com.wbg.my.service; import java.io.*; import java.net.HttpURLConnection; import java.net.URL ...

  3. Appium+Python之获取toast

    思考:手机APP上的必填或错误文本提示一般1-2s就会消失,比较难定位,所以一般的固定元素定位方式是不可用的,那我们如何定位toast呢? 前提:1.Appium1.6.3以上(包括1.6.3) 2. ...

  4. Appium+python自动化获取toast消息的方法

    转载地址:https://www.cnblogs.com/shangren/p/8191879.html 1. 首先执行这个命令:npm install -g cnpm --registry=http ...

  5. Appium+python自动化获取toast消息(windows版)的方法

    原来用的Appium1.5.3GUI版本,那为什么升级呢? 为了兼容最新版本的iOS10和Android7 Xcode8升级后,将不支持使用UIAutomation,而是改为使用XCUITest了,并 ...

  6. java反射--获取成员变量信息

    获取成员变量信息 代码及说明: public static void printFieldMessage(Object obj) { //要获取类的信息,首先要获取类的类类型 Class c=obj. ...

  7. Java:获取文件内容

    文章来源:https://www.cnblogs.com/hello-tl/p/9139353.html import java.io.*; public class FileBasicOperati ...

  8. appium自动化测试中获取toast消息的解决方法【转】

    http://blog.csdn.net/hqzxsc2006/article/details/50036911 待实践.. 解决方法:appium下切换selendroid模式去获取Android的 ...

  9. JAVA Socket获取服务端信息

    1.Socket.getInetAddress(),获取服务端地址. 2.Socket.getPort(),获取服务端端口.

随机推荐

  1. python+selenium +unittest生成HTML测试报告

    python+selenium+HTMLTestRunner+unittest生成HTML测试报告 首先要准备HTMLTestRunner文件,官网的HTMLTestRunner是python2语法写 ...

  2. 3sql

    -------------------- 三范式-- 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列. -- 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个 ...

  3. 【翻译】.NET Core3.1发布

    .NET Core3.1发布 我们很高兴宣布.NET Core 3.1的发布.实际上,这只是对我们两个多月前发布的.NET Core 3.0的一小部分修复和完善.最重要的是.NET Core 3.1是 ...

  4. 原生js删除增加修改class属性

    其实html5已经扩展了class操作的相关API,其中classList属性就以及实现了class的增删和判断. HTML DOM classList 属性 classList属性的方法有: add ...

  5. Nginx访问日志、日志切割、静态文件不记录日志和过期时间

    6月8日任务 12.10 Nginx访问日志12.11 Nginx日志切割12.12 静态文件不记录日志和过期时间 12.10 Nginx访问日志 除了在主配置文件nginx.conf里定义日志格式外 ...

  6. Vue.js 控制css样式

    <script src="https://unpkg.com/vue/dist/vue.js"></script> <style type=" ...

  7. C# 中的委托和事件(一)

    引言 委 托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 是太容易了,而没有 ...

  8. 不使用cookie记录用户信息

    cookie是什么: cookie是由web服务器保存在用户浏览器(客户端)上的小文件,它可以包含用户信息,用户操作信息等等,无论何时访问服务器,只要同源,就能携带到服务端 常见方式 一般:请求一个接 ...

  9. 《吊打面试官》系列-HashMap

    你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 上已经收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Sta ...

  10. 带着canvas去流浪系列之二 绘制折线图

    [摘要] 用canvasAPI实现echarts简易图表 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...