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:\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();
        }
    }
}

  實現效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM