appium 3-31626 toast识别
1.toast弹窗,普通方式不能获取
例如使用getPageSource是无法找到toast的信息,uiautomatorViewer加载页面时间较长,也很难采集到toast信息
2.通过curl命令探测toast
for i in `seq 1 1000`;do
date
curl -X POST http://localhost:4723/wd/hub/session/d3608ba7-08fd-4f2c-8e24-d0e58cf8f05c/elements --data-binary '{"using":"xpath","value":"//*[@class=\"android.widget.Toast\"]"}' -H "Content-Type:application/json;charset=UTF-8"
sleep 0.5
done

3.Uiautomator2对toast的支持
//Uiautomator2对toast的处理,尝试从当前界面去找toast,如果发现toast,就将toast生成一个节点(只给了text, className="android.widget.Toast", packageName="com.android.settings"3个属性)加到appium的元素树里,
private void addToastMsgRoot(CharSequence tokenMSG){
AccessibilityNodeInfo node = AccessibilityNodeInfo.obtain();
node.setText(tokenMSG);
node.setClassName(Toast.class.getName());
node.setPackageName("com.android.settings");
this.children.add(new UiAutomationElement(node));
}
3.1根据以上代码,可以使用xpath查找
- 通过//*[@class='android.widget.Toast']
- 通过//*[contains(@text,"xxxx")]
- 通过//*[@package="com.android.settings"] 使用包名去匹配toast时,注意不要和当前应用冲突,例如设置
3.2使用Java脚本探测
TestToast.java代码
#java
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
public class TestToast {
private AndroidDriver driver;
@Before
public void setUp() throws MalformedURLException {
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("platformName","android");
desiredCapabilities.setCapability("deviceName","demo");
desiredCapabilities.setCapability("appPackage","io.appium.android.apis");
desiredCapabilities.setCapability("appActivity",".ApiDemos");
desiredCapabilities.setCapability("noReset",true);
desiredCapabilities.setCapability("newCommandTimeout",120);
desiredCapabilities.setCapability("automationName","UiAutomator2");
URL RemoteURL = new URL("http://localhost:4723/wd/hub");
driver = new AndroidDriver(RemoteURL,desiredCapabilities);
driver.manage().timeouts().implicitlyWait(20000,TimeUnit.SECONDS);
}
public boolean Exist(String str) throws InterruptedException{
try{
driver.findElementByXPath(str);
return true;
}catch (Exception e){
return false;
}
}
@Test
public void test() throws InterruptedException{
SwipeClass swipe = new SwipeClass();
driver.findElementByXPath("//*[@text='Views']").click();
for(int i=0;i<5;i++){
if (Exist("//*[@text=\"Popup Menu\"]")){
driver.findElementByXPath("//*[@text=\"Popup Menu\"]").click();
break;
}else {
swipe.swipeToUp(driver);
Thread.sleep(1000);
}
}
Thread.sleep(2000);
driver.findElementByXPath("//*[@text=\"MAKE A POPUP!\"]").click();
Thread.sleep(1000);
driver.findElementByXPath("//*[@text=\"Search\"]").click();
Thread.sleep(1000);
System.out.println(driver.findElementByXPath("//*[@class=\"android.widget.Toast\"]").getText());
//System.out.println(driver.findElementByXPath("//*[@package=\"com.android.settings\"]").getText());
//System.out.println(driver.findElementByXPath("//*[contains(@text,'Clicked popup')]").getText());
}
@After
public void tearDown(){
driver.quit();
}
}

4.扩展:自动化滚动
官方示例
java_client/android/AndroidSearchingTest.java

- 方法1
public void testAutoSwipe1(){
System.out.println("MethodName: "+Thread.currentThread().getStackTrace()[1].getMethodName());
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
WebDriverWait wait = new WebDriverWait(driver,10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@text='Views']")));
driver.findElementByXPath("//android.widget.TextView[@text=\"Views\"]").click();
WebElement radioGroup = driver
.findElementByAndroidUIAutomator("new UiScrollable(new UiSelector()"
+ ".resourceId(\"android:id/list\")).scrollIntoView("
+ "new UiSelector().text(\"Popup Menu\"));");
driver.findElementByXPath("//*[@text='Popup Menu']").click();
driver.findElementByXPath("//*[@text=\"MAKE A POPUP!\"]").click();
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@text=\"Search\"]")));
driver.findElementByXPath("//*[@text=\"Search\"]").click();
System.out.println(driver.findElementByXPath("//*[@package=\"com.android.settings\"]").getText());
}

* 方法2,滑动找到元素直接点击
```#java
public void testAutoSwipe2(){
System.out.println("MethodName: "+Thread.currentThread().getStackTrace()[1].getMethodName());
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
WebDriverWait wait = new WebDriverWait(driver,10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@text='Views']")));
driver.findElementByXPath("//android.widget.TextView[@text=\"Views\"]").click();
driver.findElementByAndroidUIAutomator("new UiScrollable(new UiSelector()"
+".resourceId(\"android:id/list\")).scrollIntoView("
+"new UiSelector().text(\"Popup Menu\"));").click();
driver.findElementByXPath("//*[@text=\"MAKE A POPUP!\"]").click();
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@text=\"Search\"]")));
driver.findElementByXPath("//*[@text=\"Search\"]").click();
System.out.println(driver.findElementByXPath("//*[@class=\"android.widget.Toast\"]").getText());
}
```

- 方法3
public void testAutoSwipe3() throws InterruptedException{
System.out.println("MethodName: "+Thread.currentThread().getStackTrace()[1].getMethodName());
WebDriverWait wait = new WebDriverWait(driver,10);
WebElement el = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//android.widget.TextView[@text=\"Views\"]")));
driver.findElementByXPath("//android.widget.TextView[@text=\"Views\"]").click();
WebElement list = driver.findElement(By.id("android:id/text1"));
MobileElement webview = list.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector()).scrollIntoView("+"new UiSelector().text(\"Popup Menu\"));"));
driver.findElementByXPath("//android.widget.TextView[@text=\"Popup Menu\"]").click();
Thread.sleep(1000);
driver.findElementByXPath("//*[@text=\"MAKE A POPUP!\"]").click();
Thread.sleep(1000);
driver.findElementByXPath("//*[@text=\"Search\"]").click();
Thread.sleep(1000);
System.out.println(driver.findElementByXPath("//*[contains(@text,'Clicked popup')]").getText());
}

FAQ
1.自动滚动去寻找元素,会提示引用类型错误的提示

解决办法:只要将MobileElement替换为WebElement即可
appium 3-31626 toast识别的更多相关文章
- python3+Appium自动化04-Toast元素识别
什么是toast? 如下图,“再按一次退出程序”,这就是toast 如何定位toast元素? Appium1.6.3开始支持识别Toast内容,主要基于UiAutomator2 想定位toast元素, ...
- python+Appium自动化:toast定位
Toast简介 Toast是一种简易的消息提示框. 当视图显示给用户,在应用程序中显示为浮动.和Dialog不一样的是,它永远不会获得焦点,无法被点击. 用户将可能是在中间键入别的东西.Toast类的 ...
- Python+Appium自动化测试(13)-toast定位
一,前言 在app自动化测试的过程中经常会遇到需要对toast进行定位,最常见的就是定位toast或者获取toast的文案进行断言,如下图,通过定位"登录成功"的toast就可以断 ...
- 解决Appium 抓取toast
首先我们先看看这个gif,图中需要,要抓取的字符串--->请输入转让份数 1.要导入java-client-5.0.0-SNAPSHOT.jar 包的地址:链接:http://pan.baidu ...
- robotframework + appium 获取android toast
android toast 获取主要方式是在出现toast的时候查找元素:xpath=//*[contains(@text,'记同步')] ,该xpath 表示为toast信息含有 "记 ...
- python appium 封装获取toast方法
获取toast text封装,传入toast 部分文本,返回全部文本 def get_toast_text(self,text): try: toast_loc = (By.XPATH, " ...
- appium简单使用
App 测试通常会用到的工具 adb :Android 的控制工具,用于获取Android的各种数据和控制 Appium Desktop:内嵌了Appium Server和Inspector的综合工具 ...
- Appium之测试微信小程序
坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:Oschina.云+社区.知乎等各大平台都有. 目录 一.往期回顾 二.测试微信小程序 1.准备工作 2.操作步骤 3.注意 4.强制设置安卓的进程 ...
- 测试需要了解的技术之基础篇四__UI自动化测试体系
UI自动化测试体系 1.Andriod 自动化测试:Appium 环境安装与架构介绍.Appium Desktop用例录制.Appium测试用例流程.元素定位方法 IA/AID/XPATH/UISel ...
随机推荐
- 多重条件判断SQL:用于用户名称,密码,权限的检测和判断
string sqlstr = "select count(*) from tb_admin where 用户名='"+UserName+"'and 密码='" ...
- 1.2.2 Text_Reverse
Text Reverse Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Proble ...
- Excel 设置下拉列表
1. 把列表的候选值写到一块区域, 可以说同Sheet也可以是另一个Sheet中. 2. 选中要设置的列, 选择 Data > Data Validation 3. 在Data Validati ...
- 代理模式及Spring AOP (二)
一.Spring AOP 1.1 Spring AOP 底层还是用的动态代理.如果目标对象所对应的类有接口,spring就用jdk生成代理对象: 如果目标对象所对应的类没有接口,spring就用C ...
- Java8函数式编程学习笔记(初探)
编程语言的整个目的就在于操作值,要是按照历史上编程语言的传统,这些值被成为一等值,而编程语言中的其他结构也许有助于表示值的结构,但在程序执行期间不能传递,因此为二等值,比如方法和类等则是二等值,类可以 ...
- Linux系统部署Web项目
首先,需要有java环境和tomcat服务器,至于这个怎么安装,可以参考:云服务器 java+tomcat 部署与配置 项目部署 有两个大步骤: Step1 将已经写好的web项目打包成war包,在I ...
- 使用 WPF 开发一个 Windows 屏幕保护程序
最近有小伙伴问我如何可以让 Windows 静置一段时间不操作之后,显示一个特殊的界面.我想了想,屏幕保护程序可以做到这一点,而且,屏幕保护程序的开发也是非常简单的. 本文将介绍如何为 Windows ...
- CentOS安装crontab 定时备份文件夹
一. 编写脚本编写一个脚本文件,使脚本可以执行备份命令. 例如,将文件目录 /home/backups/balalala 备份到/home目录下,并压缩.1. 创建脚本命令格式: touch 路径/文 ...
- 《DSP using MATLAB》Problem 4.21
快到龙抬头,居然下雪了,天空飘起了雪花,温度下降了近20°. 代码: %% -------------------------------------------------------------- ...
- freemarker逻辑判断写法#if
<li class="<#if (position.flag)! =='haha1'>hide<#else >show</#if>"> ...