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


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

     

    在bootstrap项目中的io.appium.android.bootstrap.handler包中的类都是对应的指令类,

    private static HashMap<String, CommandHandler> map = new HashMap<String, CommandHandler>();

    static {
    map.put("waitForIdle", new WaitForIdle());
    map.put("clear", new Clear());
    map.put("orientation", new Orientation());
    map.put("swipe", new Swipe());
    map.put("flick", new Flick());
    map.put("drag", new Drag());
    map.put("pinch", new Pinch());
    map.put("click", new Click());
    map.put("touchLongClick", new TouchLongClick());
    map.put("touchDown", new TouchDown());
    map.put("touchUp", new TouchUp());
    map.put("touchMove", new TouchMove());
    map.put("getText", new GetText());
    map.put("setText", new SetText());
    map.put("getName", new GetName());
    map.put("getAttribute", new GetAttribute());
    map.put("getDeviceSize", new GetDeviceSize());
    map.put("scrollTo", new ScrollTo());
    map.put("find", new Find());
    map.put("getLocation", new GetLocation());
    map.put("getSize", new GetSize());
    map.put("wake", new Wake());
    map.put("pressBack", new PressBack());
    map.put("dumpWindowHierarchy", new DumpWindowHierarchy());
    map.put("pressKeyCode", new PressKeyCode());
    map.put("longPressKeyCode", new LongPressKeyCode());
    map.put("takeScreenshot", new TakeScreenshot());
    map.put("updateStrings", new UpdateStrings());
    map.put("getDataDir", new GetDataDir());
    map.put("performMultiPointerGesture", new MultiPointerGesture());
    map.put("openNotification", new OpenNotification());
    }

    我们来看WaitForIdle:

    package io.appium.android.bootstrap.handler;

    import com.android.uiautomator.core.UiDevice;
    import io.appium.android.bootstrap.AndroidCommand;
    import io.appium.android.bootstrap.AndroidCommandResult;
    import io.appium.android.bootstrap.CommandHandler;
    import org.json.JSONException;

    import java.util.Hashtable;

    /**
    * This handler is used to clear elements in the Android UI.

    * Based on the element Id, clear that element.

    */
    public class WaitForIdle extends CommandHandler {

    /*
    * @param command The {@link AndroidCommand}

    * @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();
    long timeout = 10;
    if (params.containsKey("timeout")) {
    timeout = (Integer) params.get("timeout");
    }

    UiDevice d = UiDevice.getInstance();
    d.waitForIdle(timeout);
    return getSuccessResult(true);
    }
    }

    首先是获取命令里面参数,然后初始化一个timeout私有变量,如果参数里不含时间,那么就用这个默认的时间。然后调用uiautomator的UiDevice的对象里方法waitForIdle(),该方法就在timeout时间内界面上没有其他操作,处于空闲状态。

    Clear:

    package io.appium.android.bootstrap.handler;

    import com.android.uiautomator.core.UiObjectNotFoundException;
    import io.appium.android.bootstrap.*;
    import org.json.JSONException;

    /**
    * This handler is used to clear elements in the Android UI.

    * Based on the element Id, clear that element.

    */
    public class Clear extends CommandHandler {

    /*
    * @param command The {@link AndroidCommand}

    * @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 {
    if (command.isElementCommand()) {
    try {
    final AndroidElement el = command.getElement();
    el.clearText();
    return getSuccessResult(true);
    } catch (final UiObjectNotFoundException e) {
    return new AndroidCommandResult(WDStatus.NO_SUCH_ELEMENT,
    e.getMessage());
    } catch (final Exception e) { // handle NullPointerException
    return getErrorResult("Unknown error clearing text");
    }
    }
    return getErrorResult("Unknown error");
    }
    }

    Clear的方法中就看e1.clearText()方法,其他的我在click中都有涉及。
    private final UiObject el;
    public void clearText() throws UiObjectNotFoundException {
    el.clearTextField();
    }
    实际上调用的是uiautomator中的UiObject.clearTextField(),清除文本框内的内容。

  • 相关阅读:
    [译]CasperJS,基于PhantomJS的工具包
    [译]JavaScript:typeof的用途
    [译]JavaScript写的一个quine程序
    [译]Ruby中的解构赋值
    [译]DOM:元素ID就是全局变量
    [译]ECMAScript 6中的集合类型,第一部分:Set
    [译]JavaScript:Array.prototype和[]的性能差异
    [译]Web Inspector开始支持CSS区域
    [译]JavaScript:反科里化"this"
    [译]JavaScript:用什么来缩进
  • 原文地址:https://www.cnblogs.com/poptest/p/4958772.html
Copyright © 2020-2023  润新知