appium+java(八)獲取Toast內容信息

前言

Appium中很經典的問題了,在兩年前也就是2017年3月6號07:22分,我纔看到appium1.6.3版本的發佈,更新內容爲Ios上能夠實現Toast的獲取,而Windows也就是安卓端,還須要等待,惋惜在那會沒有mac本,很遺憾,沒法動手嘗試,這個問題就一直擱置了,當時還發了個朋友圈記錄下當時的心情。以下圖:java

 

 

 

 

什麼是Toast?

Android中的Toast是一種消息提示彈框,且Toast顯示時間有限,通常3秒左右就消失,沒法使用定位元素工具定位,且沒法被點擊操做。node

簡單理解,就是彈窗提示語,即你操做行爲以後給出的提示,好比微信app的登陸功能,你輸入正確帳號,密碼,點擊登陸,會提示正在登陸灰色一散而過的信息,以下圖:android

環境(win10系統)

  • Appium:1.15.1
  • JAVA Client:6.1.0
  • JAVA:1.8
  • Android模擬器:7.0
  • SDK

準備工做

必須命令安裝,客戶端desktop這種確定不行,就別試驗了,卸載客戶端apache

一、先卸載最新版本的appium

npm unistall -g appium

二、查看電腦中還有沒有appium

appium -v

三、如沒有,須要npm安裝檢驗appium版本驗證

appium -v

若是第二步還存在說明appium安裝到其餘目錄下了,查看appium路徑:which appium,此時可能會輸出路徑爲【/usr/local/bin/appium】,進到這個目錄下手動刪除appium文件夾,再輸入:appium -v,此時應該就沒有,提示:zsh: command not found: appiumnpm

四、再從新安裝appium指定版本

cnpm install -g appium@1.10.0

ps:沒錯,就是1.10.0版本的好用,降版本操做微信

再輸入:appium -v,此時應該就有1.10.0版本提示了app

六、安裝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

七、安裝appium-uiautomator2-server-v1.12.0.apk、appium-uiautomator2-server-debug-androidTest.apk

去上圖目錄下,找到這兩個apk,安裝到手機便可ui

代碼實現

  • 初始化中加入以下代碼:
   capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.ANDROID_UIAUTOMATOR2);
  • 定位toast元素

具體示例代碼:spa

import com.neuxa.autotest.report.RtAnnotation;
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信息
 */
@RtAnnotation(caseId = "666", bugId = "無bug號關聯")
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();
        }
    }
}

  實現效果:

相關文章
相關標籤/搜索