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("关闭成功");
				}
			}
	}
}

猜你喜欢

转载自blog.csdn.net/jffhy2017/article/details/84936164
今日推荐