Uiautomator2與toast獲取
阿新 • • 發佈:2018-12-10
uiautomator2工作原理:
WebDriver script:就是我們的執行指令碼
Appium:
客戶端傳遞desired capabilities屬性配置給Appium Server來建立一個會話,Appium Server會呼叫appium-uiautomator2-driver,同時將UiAutomator2 server的兩個apk安裝到測試裝置上
1、appium-uiautomator2-server-vx.x.x.APK
2、appium-uiautomator2-server-debug-androidTest.apk
UiAutomator2 server兩個apk的作用:
1、UiAutomator2 驅動模組,負責建立會話,安裝UiAutomator2-server.apk到裝置上,開啟Netty(這是一個通訊框架,相當於Bootstrap使用的SocketServer升級版本)
2、UiAutomator2伺服器模組,當驅動模組創初始化完畢,伺服器就會監聽PC端Appium傳送過來的請求,將請求傳送給真正底層的UiAutomator2。
InitDriver.java類新增uiautomator獲取驅動的方法:
/** * 使用的是UIautomator模式,此模式下支援toast獲取 * @param appPackage * @param appActivity * @param appWaitActivity * @return * @throws Exception */ public static AndroidDriver<AndroidElement> getDriverAlreadyInstallByUiautomator2(String appPackage,String appActivity) throws Exception{ DesiredCapabilities caps =commonCaps(); caps.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, appPackage); caps.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, appActivity); caps.setCapability(MobileCapabilityType.AUTOMATION_NAME, AutomationName.ANDROID_UIAUTOMATOR2); AndroidDriver<AndroidElement> driver = new AndroidDriver<>(new URL( "http://127.0.0.1:4723/wd/hub"), caps); return driver; } private static DesiredCapabilities commonCaps(){ // caps變數是我們指令碼告訴appium服務端的初始化引數 DesiredCapabilities caps = new DesiredCapabilities(); // 裝置名稱,但是這個引數在安卓上可以隨便寫,但是不能沒有 caps.setCapability(MobileCapabilityType.DEVICE_NAME, "xxx"); // 表示使用appium自帶的uicode輸入法,該輸入法支援中文並且會隱藏鍵盤 caps.setCapability(AndroidMobileCapabilityType.UNICODE_KEYBOARD, true); // 表示在執行測試完成後,將裝置的輸入法重置回原來的 caps.setCapability(AndroidMobileCapabilityType.RESET_KEYBOARD, true); // true表示不重簽名app,但是selendroid模式是必須要重簽名的 caps.setCapability(AndroidMobileCapabilityType.NO_SIGN, true); //appium預設為uiautomator caps.setCapability(MobileCapabilityType.AUTOMATION_NAME, "appium"); caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android"); // caps.setCapability("autoGrantPermissions", true); // caps.setCapability(MobileCapabilityType.UDID, "192.168.2.193:5555"); return caps; }
用例實現:登入知乎在密碼錯誤的情況下會彈出toast提示框,並用來判斷
//uiautomator2獲取toast
public void loginGetToast() throws Exception{
try {
driver.findElementById("android:id/button3").click();
} catch (Exception e) {
System.out.println("沒有彈框");
}
driver.findElement(MobileBy.AndroidUIAutomator("new UiSelector().text(\"郵箱\")")).click();
driver.findElement(MobileBy.AndroidUIAutomator("new UiSelector().text(\"郵箱\")")).click();
driver.findElementById("email_input_view").sendKeys(" [email protected]");
driver.findElementById("com.zhihu.android:id/password").sendKeys("28763234abc");
Boolean flag=true;
//顯式等待
WebDriverWait wait=new WebDriverWait(driver, 10);
try {
//AndroidElement toast=(AndroidElement) wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@text='帳號或密碼錯誤']")));
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@text='帳號或密碼錯誤1']")));
//System.out.println(toast.getText());
} catch (Exception e) {
flag=false;
}
if(flag=true){
System.out.println("密碼錯誤,提示正確");
}else{
System.out.println("密碼錯誤,提示不正確");
}
}
測試程式碼:
public class ZhihuTestApp {
public static void main(String[] args) throws Exception {
AndroidDriver<AndroidElement> driver=null;
try {
driver=InitDriver.getDriverAlreadyInstallByUiautomator2("com.zhihu.android", "com.zhihu.android.app.ui.activity.MainActivity");
Login login =new Login(driver);
login.loginGetToast();
} catch (Exception e) {
e.printStackTrace();
}finally{
if(driver!=null){
driver.quit();
System.out.println("關閉成功");
}
}
}
}