【Appium】Android Toast捕獲

簡介

Android Toast是在使用app時的一個彈出文字提醒,一般持續顯示2-3秒就消失,在做自動化測試時需要捕獲toast來做一些驗證。但是toast是屬於Android系統級別的提醒,很難捕獲到,所以記錄下如何捕獲toast。

下面以appium官方自帶的debug app來演示,debug app下載地址:
https://github.com/appium/appium/blob/master/sample-code/apps/ApiDemos-debug.apk

我們要捕獲如下圖所示的toast:
在這裏插入圖片描述
環境:

  • JDK 1.8
  • Appium-windows-1.15.1.exe

捕獲原理

Appium在UIAutomator2引擎下支持對toast的捕獲,捕獲原理代碼如下圖,即Android後臺開了一個服務,當界面發生變化時就去捕獲信息,如果發現是一個toast,就把toast信息保存起來。
在這裏插入圖片描述

識別原理

上面捕獲到toast後,會把toast信息封裝成一個節點放到出現toast界面的空間樹裏,如下圖所示,把toast的信息設置成節點的內容,該節點的類名爲“Toast.class.getName”,包名爲“com.android.settings”。
在這裏插入圖片描述

捕獲toast

現在我們已經知道了toast這個節點,那就可以用xpath來定位了。有兩種方法:

  • //*[@class=‘android.widget.Toast’]
  • //*[contains(@text,“xxxx”)]

示例代碼:

import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import test.java.common.OperateElement;

import java.net.URL;
import java.util.concurrent.TimeUnit;

/**
 * Author: 靈樞
 * Date: 2019/11/22
 * Time: 9:34
 * Description:
 */
public class UIAutomatorTest {
    private AndroidDriver driver;

    @BeforeClass
    public void setUp() throws Exception{
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("deviceName","Android Emulator");
        capabilities.setCapability("noReset",true);
        capabilities.setCapability("unicodeKeyboard",true);
        capabilities.setCapability("autoGrantPermissions",true);
        capabilities.setCapability("appPackage","io.appium.android.apis");
        capabilities.setCapability("appActivity",".ApiDemos");
        //初始化
        driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
        // 設置隱式等待時間
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }

    @AfterClass()
    public void tearDown() {
        driver.quit();
    }

    @Test
    public void testToast(){
        // 點擊Views
        driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Views\")").click();
        // 滑動屏幕,點擊Popup Menu
        driver.findElementByAndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true).instance(0))." +
                "scrollIntoView(new UiSelector().text(\"Popup Menu\").instance(0));").click();
        // 點擊按鈕
        driver.findElementByAccessibilityId("Make a Popup!").click();
        // 點擊Search
        driver.findElementByXPath("//*[@text='Search']").click();
        // 捕獲toast
        String searchToast = driver.findElementByXPath("//*[@class='android.widget.Toast']").getText();
        Assert.assertEquals(searchToast,"Clicked popup menu item Search");
        OperateElement.threadSleep(3000);
    }

運行如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章