1. 程式人生 > >Uiautomator2與toast獲取

Uiautomator2與toast獲取

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("關閉成功");
				}
			}
	}
}