zoukankan      html  css  js  c++  java
  • 手机自动化测试:appium源码分析之bootstrap四

    手机自动化测试:appium源码分析之bootstrap四

     

    Orientation是调整屏幕方向的操作

    package io.appium.android.bootstrap.handler;

    import android.os.RemoteException;
    import com.android.uiautomator.core.UiDevice;
    import io.appium.android.bootstrap.*;
    import org.json.JSONException;

    import java.util.Hashtable;

    /**
    * This handler is used to get or set the orientation of the device.

    */
    public class Orientation extends CommandHandler {

    /*
    * @param command The {@link AndroidCommand} used for this handler.

    * @return {@link AndroidCommandResult}

    * @throws JSONException

    * @see io.appium.android.bootstrap.CommandHandler#execute(io.appium.android.
    * bootstrap.AndroidCommand)
    */
    @Override
    public AndroidCommandResult execute(final AndroidCommand command)
    throws JSONException {

    final Hashtable<String, Object> params = command.params();
    if (params.containsKey("orientation")) {
    // Set the rotation

    final String orientation = (String) params.get("orientation");
    try {
    return handleRotation(orientation);
    } catch (final Exception e) {
    return getErrorResult("Unable to rotate screen: " + e.getMessage());
    }
    } else {
    // Get the rotation
    return getRotation();
    }

    }

    /**
    * Returns the current rotation

    * @return {@link AndroidCommandResult}
    */
    private AndroidCommandResult getRotation() {
    String res = null;
    final UiDevice d = UiDevice.getInstance();
    final OrientationEnum currentRotation = OrientationEnum.fromInteger(d
    .getDisplayRotation());
    Logger.debug("Current rotation: " + currentRotation);
    switch (currentRotation) {
    case ROTATION_0:
    case ROTATION_180:
    res = "PORTRAIT";
    break;
    case ROTATION_90:
    case ROTATION_270:
    res = "LANDSCAPE";
    break;
    }

    if (res != null) {
    return getSuccessResult(res);
    } else {
    return getErrorResult("Get orientation did not complete successfully");
    }
    }

    /**
    * Set the desired rotation

    * @param orientation
    * The rotation desired (LANDSCAPE or PORTRAIT)
    * @return {@link AndroidCommandResult}
    * @throws RemoteException
    * @throws InterruptedException
    */
    private AndroidCommandResult handleRotation(final String orientation)
    throws RemoteException, InterruptedException {
    final UiDevice d = UiDevice.getInstance();
    OrientationEnum desired;
    OrientationEnum current = OrientationEnum.fromInteger(d
    .getDisplayRotation());

    Logger.debug("Desired orientation: " + orientation);
    Logger.debug("Current rotation: " + current);

    if (orientation.equalsIgnoreCase("LANDSCAPE")) {
    switch (current) {
    case ROTATION_0:
    d.setOrientationRight();
    desired = OrientationEnum.ROTATION_270;
    break;
    case ROTATION_180:
    d.setOrientationLeft();
    desired = OrientationEnum.ROTATION_270;
    break;
    default:
    return getSuccessResult("Already in landscape mode.");
    }
    } else {
    switch (current) {
    case ROTATION_90:
    case ROTATION_270:
    d.setOrientationNatural();
    desired = OrientationEnum.ROTATION_0;
    break;
    default:
    return getSuccessResult("Already in portrait mode.");
    }
    }
    current = OrientationEnum.fromInteger(d.getDisplayRotation());
    // If the orientation has not changed,
    // busy wait until the TIMEOUT has expired
    final int TIMEOUT = 2000;
    final long then = System.currentTimeMillis();
    long now = then;
    while (current != desired && now - then < TIMEOUT) {
    Thread.sleep(100);
    now = System.currentTimeMillis();
    current = OrientationEnum.fromInteger(d.getDisplayRotation());
    }
    if (current != desired) {
    return getErrorResult("Set the orientation, but app refused to rotate.");
    }
    return getSuccessResult("Rotation (" + orientation + ") successful.");
    }
    }

    execute方法中,首先判断参数中是否含有orientation,如果含有调用handleRotation,否则调用getRotation。
    handleRotation,
    这种情况是参数里含有orientation,此时,我们来看看该方法中做了哪些事。
    final UiDevice d = UiDevice.getInstance();
    OrientationEnum desired;
    OrientationEnum current = OrientationEnum.fromInteger(d
    .getDisplayRotation());

    首先获取当前设备的方向,然后初始化一个私有变量,以备后用。其中OrientationEnum枚举类里定义了4个方向,fromInteger方法是根据整数值得到相应的枚举值,其中各个值的意思。

    public enum OrientationEnum {
    ROTATION_0(0), ROTATION_90(1), ROTATION_180(2), ROTATION_270(3);

    public static OrientationEnum fromInteger(final int x) {
    switch (x) {
    case 0:
    return ROTATION_0;
    case 1:
    return ROTATION_90;
    case 2:
    return ROTATION_180;
    case 3:
    return ROTATION_270;
    }
    return null;
    }

    getRotation方法,该方法中就是根据当前的屏幕的方向得到横屏还是竖屏,将结果返回给客户端。很简单。

    通过上面的分析,说明客户端关于屏幕方向的命令有2种:获取屏幕的方向,改变屏幕的方向
    注意设备的方向和里面视图的方向的区别。

  • 相关阅读:
    数据结构第四篇——线性表的链式存储之双向链表
    基本概念之引用赋值需要注意什么?
    基本概念之将引用作为函数的参数有哪些特点?
    基本概念之什么是引用?
    基本概念之模板类有什么优势?
    我的第一篇博文
    为CentOS 6 配置本地YUM源
    为CentOS 6 配置本地YUM源
    poj 1990 MooFest
    [置顶] 学生信息管理系统“重复设置”问题
  • 原文地址:https://www.cnblogs.com/poptest/p/4949883.html
Copyright © 2011-2022 走看看