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识别的更多相关文章

  1. python3+Appium自动化04-Toast元素识别

    什么是toast? 如下图,“再按一次退出程序”,这就是toast 如何定位toast元素? Appium1.6.3开始支持识别Toast内容,主要基于UiAutomator2 想定位toast元素, ...

  2. python+Appium自动化:toast定位

    Toast简介 Toast是一种简易的消息提示框. 当视图显示给用户,在应用程序中显示为浮动.和Dialog不一样的是,它永远不会获得焦点,无法被点击. 用户将可能是在中间键入别的东西.Toast类的 ...

  3. Python+Appium自动化测试(13)-toast定位

    一,前言 在app自动化测试的过程中经常会遇到需要对toast进行定位,最常见的就是定位toast或者获取toast的文案进行断言,如下图,通过定位"登录成功"的toast就可以断 ...

  4. 解决Appium 抓取toast

    首先我们先看看这个gif,图中需要,要抓取的字符串--->请输入转让份数 1.要导入java-client-5.0.0-SNAPSHOT.jar 包的地址:链接:http://pan.baidu ...

  5. robotframework + appium 获取android toast

    android toast 获取主要方式是在出现toast的时候查找元素:xpath=//*[contains(@text,'记同步')]  ,该xpath 表示为toast信息含有  "记 ...

  6. python appium 封装获取toast方法

    获取toast text封装,传入toast 部分文本,返回全部文本 def get_toast_text(self,text): try: toast_loc = (By.XPATH, " ...

  7. appium简单使用

    App 测试通常会用到的工具 adb :Android 的控制工具,用于获取Android的各种数据和控制 Appium Desktop:内嵌了Appium Server和Inspector的综合工具 ...

  8. Appium之测试微信小程序

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:Oschina.云+社区.知乎等各大平台都有. 目录 一.往期回顾 二.测试微信小程序 1.准备工作 2.操作步骤 3.注意 4.强制设置安卓的进程 ...

  9. 测试需要了解的技术之基础篇四__UI自动化测试体系

    UI自动化测试体系 1.Andriod 自动化测试:Appium 环境安装与架构介绍.Appium Desktop用例录制.Appium测试用例流程.元素定位方法 IA/AID/XPATH/UISel ...

随机推荐

  1. haproxy配置示例

    1.最基础的的配置 下面的例子配置了一个监听在所有接口的80端口上HTTP proxy服务,它转发所有的请求至后端监听在127.0.0.1:8000上的"server". glob ...

  2. springboot date接收参数

    使用springboot框架对日期类型进行操作,遇到无法保持的情况,一开始报400的错误(解决方法),解决之后日期类型无法保存到数据库,为了解决这个问题,设置了个全局date转换器. 配置方法 1.新 ...

  3. radio属性添加

    经常会遇到js控制radio选中和切换的问题 之前一直使用的是checked属性来完成的 但是现在发现这个属性有个大问题 今天就是用js给选中radio的赋值,使用的$().attr("ch ...

  4. 【转】react的高阶组件

    React进阶之高阶组件   前言 本文代码浅显易懂,思想深入实用.此属于react进阶用法,如果你还不了解react,建议从文档开始看起. 我们都知道高阶函数是什么, 高阶组件其实是差不多的用法,只 ...

  5. Vue.js更改调试地址端口号

    Vue项目一般使用自带的脚手架工具vue-cli和webpack打包方式进行项目构建运行.开发中,我们在控制台输入命令行npm run dev部署项目后,默认开启的页面调试地址是8080端口.但是有时 ...

  6. 日志的处理 —— 使用 log4j

    通过 log4j,日志信息不仅打印到 console,而且输出到指定文件,根据配置信息: <dependency> <groupId>log4j</groupId> ...

  7. Sublime 下配置vim模式 + VintageEx-master下载地址

       VintageEx-master下载地址: 官方地址:https://github.com/SublimeText/VintageEx 百度云链接: http://pan.baidu.com/s ...

  8. Lua基本语法-书写规范以及自带常用函数

    Lua基本语法-书写规范和常用函数 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 String Ope ...

  9. Laravel学习之旅(三)

    视图 一.怎么新建视图: 1.视图默认存放路径:resources/views: 2.laravel模板支持原生的PHP,直接可以在resources/views新建一个PHP文件,例如: index ...

  10. Koa下http代理

    前言 最近做管理后台的重构或者说重做. 至于为什么要重构. 随意的解释: 是原来写的人走了. 客观的解释: 用的人觉得不好用 维护的人员找不到北 再多一点解释: express + ejs的混合编写 ...