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

   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。poptest测试开发工程师就业培训请大家咨询qq:908821478)移动端自动化测试是未来的测试工程师的技术要求,我们需要打好基础。

Drag

package io.appium.android.bootstrap.handler;

 

import com.android.uiautomator.core.UiDevice;

import com.android.uiautomator.core.UiObjectNotFoundException;

import io.appium.android.bootstrap.*;

import io.appium.android.bootstrap.exceptions.InvalidCoordinatesException;

import io.appium.android.bootstrap.utils.Point;

import org.json.JSONException;

import org.json.JSONObject;

 

import java.util.Hashtable;

 

/**

 * This handler is used to drag in the Android UI.

 *

 */

public class Drag 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)

   */

 

  private static class DragArguments {

 

    public AndroidElement el;

    public AndroidElement destEl;

    public final Point    start;

    public final Point    end;

    public final Integer  steps;

 

    public DragArguments(final AndroidCommand command) throws JSONException {

 

      final Hashtable<String, Object> params = command.params();

 

      try {

        if (params.get("elementId") != JSONObject.NULL) {

          el = command.getElement();

        }

      } catch (final Exception e) {

        el = null;

      }

 

      try {

        if (params.get("destElId") != JSONObject.NULL) {

          destEl = command.getDestElement();

        }

      } catch (final Exception e) {

        destEl = null;

      }

      start = new Point(params.get("startX"), params.get("startY"));

      end = new Point(params.get("endX"), params.get("endY"));

      steps = (Integer) params.get("steps");

    }

  }

 

  private AndroidCommandResult drag(final DragArguments dragArgs) {

    Point absStartPos = new Point();

    Point absEndPos = new Point();

    final UiDevice device = UiDevice.getInstance();

 

    try {

      absStartPos = getDeviceAbsPos(dragArgs.start);

      absEndPos = getDeviceAbsPos(dragArgs.end);

    } catch (final InvalidCoordinatesException e) {

      return getErrorResult(e.getMessage());

    }

 

    Logger.debug("Dragging from " + absStartPos.toString() + " to "

        + absEndPos.toString() + " with steps: " + dragArgs.steps.toString());

    final boolean rv = device.drag(absStartPos.x.intValue(),

        absStartPos.y.intValue(), absEndPos.x.intValue(),

        absEndPos.y.intValue(), dragArgs.steps);

    if (!rv) {

      return getErrorResult("Drag did not complete successfully");

    }

    return getSucce***esult(rv);

  }

 

  private AndroidCommandResult dragElement(final DragArguments dragArgs) {

    Point absEndPos = new Point();

 

    if (dragArgs.destEl == null) {

      try {

        absEndPos = getDeviceAbsPos(dragArgs.end);

      } catch (final InvalidCoordinatesException e) {

        return getErrorResult(e.getMessage());

      }

 

      Logger.debug("Dragging the element with id " + dragArgs.el.getId()

          + " to " + absEndPos.toString() + " with steps: "

          + dragArgs.steps.toString());

      try {

        final boolean rv = dragArgs.el.dragTo(absEndPos.x.intValue(),

            absEndPos.y.intValue(), dragArgs.steps);

        if (!rv) {

          return getErrorResult("Drag did not complete successfully");

        } else {

          return getSucce***esult(rv);

        }

      } catch (final UiObjectNotFoundException e) {

        return getErrorResult("Drag did not complete successfully"

            + e.getMessage());

      }

    } else {

      Logger.debug("Dragging the element with id " + dragArgs.el.getId()

          + " to destination element with id " + dragArgs.destEl.getId()

          + " with steps: " + dragArgs.steps);

      try {

        final boolean rv = dragArgs.el.dragTo(dragArgs.destEl.getUiObject(),

            dragArgs.steps);

        if (!rv) {

          return getErrorResult("Drag did not complete successfully");

        } else {

          return getSucce***esult(rv);

        }

      } catch (final UiObjectNotFoundException e) {

        return getErrorResult("Drag did not complete successfully"

            + e.getMessage());

      }

    }

 

  }

 

  @Override

  public AndroidCommandResult execute(final AndroidCommand command)

      throws JSONException {

    // DragArguments is created on each execute which prevents leaking state

    // across executions.

    final DragArguments dragArgs = new DragArguments(command);

 

    if (command.isElementCommand()) {

      return dragElement(dragArgs);

    } else {

      return drag(dragArgs);

    }

  }

}

首先来看DragArguments对象。该类为Drag中的私有类,它的构造方法回去解析传入的command,然后获得并存储一些drag方法用到的参数。例如拖拽控件时,被拖拽的控件对象,拖拽到的控件对象。坐标拖拽时,起始点坐标、终点坐标、步骤。所以就把它看成一个实体类就行了。然后分控件和坐标分别调用dragElement()和drag()方法。

dragElement()

如果拖拽到的控件不存在,那么就要用到结束坐标。如果拖拽到的控件存在,那么就用该控件计算拖拽到坐标,调用UiObject.dragTo()方法来执行命令。

drag()

直接调用UiObject.dragTo来执行