appium+java(八)获取Toast内容信息
前言
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内容信息的更多相关文章
- appium获取Toast内容的方法
做自动化测试的时候,可能需要根据弹出的Toast提示来做下一步判断.这里记录一下获取Toast内容的方法,同时巩固一下显示等待的方法之一WebDriverWait. from selenium.web ...
- java提取(获取)博客信息(内容)
package com.wbg.my.service; import java.io.*; import java.net.HttpURLConnection; import java.net.URL ...
- Appium+Python之获取toast
思考:手机APP上的必填或错误文本提示一般1-2s就会消失,比较难定位,所以一般的固定元素定位方式是不可用的,那我们如何定位toast呢? 前提:1.Appium1.6.3以上(包括1.6.3) 2. ...
- Appium+python自动化获取toast消息的方法
转载地址:https://www.cnblogs.com/shangren/p/8191879.html 1. 首先执行这个命令:npm install -g cnpm --registry=http ...
- Appium+python自动化获取toast消息(windows版)的方法
原来用的Appium1.5.3GUI版本,那为什么升级呢? 为了兼容最新版本的iOS10和Android7 Xcode8升级后,将不支持使用UIAutomation,而是改为使用XCUITest了,并 ...
- java反射--获取成员变量信息
获取成员变量信息 代码及说明: public static void printFieldMessage(Object obj) { //要获取类的信息,首先要获取类的类类型 Class c=obj. ...
- Java:获取文件内容
文章来源:https://www.cnblogs.com/hello-tl/p/9139353.html import java.io.*; public class FileBasicOperati ...
- appium自动化测试中获取toast消息的解决方法【转】
http://blog.csdn.net/hqzxsc2006/article/details/50036911 待实践.. 解决方法:appium下切换selendroid模式去获取Android的 ...
- JAVA Socket获取服务端信息
1.Socket.getInetAddress(),获取服务端地址. 2.Socket.getPort(),获取服务端端口.
随机推荐
- 正确理解 PHP 的重载
PHP 的重载跟 Java 的重载不同,不可混为一谈.Java 允许类中存在多个同名函数,每个函数的参数不相同,而 PHP 中只允许存在一个同名函数.例如,Java 的构造函数可以有多个,PHP 的构 ...
- 做为GPU服务器管理员,当其他用户需要执行某个要root权限的命令时,除了告诉他们root密码,还有没有别的办法?
通常一台GPU服务器(这里指linux系统)不可能只有一个帐号能用的,比如当其他用户想要在GPU服务器上安装一些软件的时候,会需要用到apt-get命令,但是apt-get命令需要root用户的操作权 ...
- linux bash编程之算数运算和测试类型(第二篇)
写在最前边:在bash中数据类型有两种,分别是数值型和字符型.其中字符型是默认的. 1.算数运算 · 运算符 · 语法 1.1.运算符:+.-.*./.%.** 注意:有些时候 *(乘号)需要转义 1 ...
- Linux -- 信号发送实现
信号是Linux系统响应某些条件而产生的一个事件,接收该信号的进程会响应地采取一些行动 signal 定义 在进程控制块 (PCB Process Control Block) 的数据结构中,存在 ...
- python网络爬虫之入门[一]
目录 前言 一.探讨什么是python网络爬虫? 二.一个针对于网络传输的抓包工具fiddler 三.学习request模块来爬取第一个网页 * 扩展内容(爬取top250的网页) 后记 @(目录) ...
- Linux如何切换图形界面和命令行界面
在命令行,输入 init 3 命令,并按回车键执行,切换到命令行界面 切换到命令行界面后,在界面上只显示一个闪烁的光标,按下 Ctrl+Alt+F6(非虚拟机)或者 Alt+F6(虚拟机),显示用户登 ...
- 使用JSCH执行命令并读取终端输出的一些使用心得
使用Jsch执行命令,并读取终端输出 jsch http://www.jcraft.com/jsch/ Jsch是java实现的一个SSH客户端.开发JSCH的公司是 jcraft: JCraft成立 ...
- 线程池&进程池
线程池&进程池 池子解决什么问题? 1.创建/销毁线程伴随着系统开销,如果过于频繁会影响系统运行效率 2.线程并发数量过多,抢占系统资源,从而导致系统阻塞甚至死机 3.能够刚好的控制和管理池子 ...
- day26
绑定方法 分为对象绑定方法和类的绑定方法 绑定方法的特殊之处 绑定给谁就是谁来调用 类的绑定方法 绑定给类,类来调用,会把类自身传过来 不需要通过对象 ,只需要通过类就能获取到一些东西的时候,用类的绑 ...
- Flask使用bootstrap为HttpServer添加上传文件功能
关于模态框 使用bootstrap实现点击按钮弹出窗口,简直不要太简单.我们只需要将写好的窗口内容隐藏,然后调用bootstrap的框架即可,简单几行就能完成相关功能实现.... 前提条件是,我们需要 ...