簡介
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);
}
運行如下: