• 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.0

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

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

    6、安装appium-uiautomator2-driver

    cnpm install appium-uiautomator2-driver

    安装成功后可以在 C:UsersAdministrator ode_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();
            }
        }
    }

      实现效果:

     

  • 相关阅读:
    详解C#委托,事件与回调函数
    JavaScript Dictionary
    jQuery匹配各种条件的选择器用法
    通用Json的处理办法
    JavaScript 创建类/对象的几种方式
    捕获和记录SQL Server中发生的死锁
    [转] HTML 获取屏幕、浏览器、页面的高度宽度
    [转] 实时监听input输入的变化(兼容主流浏览器)
    [转] Web移动端Fixed布局的解决方案
    [转] offsetParent 到底是哪一个?
  • 原文地址:https://www.cnblogs.com/longronglang/p/11870097.html
Copyright © 2020-2023  润新知