Java源码示例:androidx.test.uiautomator.BySelector

示例1
public UiObject2 getElement(BySelector bySelector, int timeout) throws UiObjectNotFoundException {

        UiObject2 uiObject;
        if (this.order > 0) {
            List<UiObject2> objs = getUiDevice().wait(Until.findObjects(bySelector), timeout);
            if (objs == null) {
                uiObject = null;
            } else {
                uiObject = objs.get(this.order - 1);
            }
        } else {
            uiObject = getUiDevice().wait(Until.findObject(bySelector), timeout);
        }
        if (uiObject == null)
            throw new UiObjectNotFoundException("element not found");

        return uiObject;
    }
 
示例2
public UiObject2 getElement(BySelector bySelector, int swipCount, String direction) throws UiObjectNotFoundException {
    UiObject2 uiObject = null;
    for (int i = 0; i < swipCount; i++) {
        uiObject = getUiDevice().wait(Until.findObject(bySelector), 1000);
        if (uiObject != null) {
            break;
        }
        Swipe upSwip = new Swipe();
        upSwip.setDirection(direction);
        upSwip.runSelf();
    }
    if (uiObject == null) {
        throw new UiObjectNotFoundException("element not found");
        // bySelector.
    } else {
        return uiObject;
    }
}
 
示例3
@Nullable
@Override
public Object getChild(final Object selector) throws UiObjectNotFoundException {
    if (selector instanceof UiSelector) {
        /*
         * We can't find the child element with UiSelector on UiObject2,
         * as an alternative creating UiObject with UiObject2's AccessibilityNodeInfo
         * and finding the child element on UiObject.
         */
        AccessibilityNodeInfo nodeInfo = AccessibilityNodeInfoGetter.fromUiObject(element);

        UiSelector uiSelector = new UiSelector();
        CustomUiSelector customUiSelector = new CustomUiSelector(uiSelector);
        uiSelector = customUiSelector.getUiSelector(nodeInfo);
        Object uiObject = CustomUiDevice.getInstance().findObject(uiSelector);
        if (uiObject instanceof UiObject) {
            AccessibilityNodeInfoGetter.fromUiObject(element);
            return ((UiObject) uiObject).getChild((UiSelector) selector);
        }
        return null;
    }
    return element.findObject((BySelector) selector);
}
 
示例4
@Override
public List<?> getChildren(final Object selector, final By by) throws UiObjectNotFoundException {
    if (selector instanceof UiSelector) {
        /*
         * We can't find the child elements with UiSelector on UiObject2,
         * as an alternative creating UiObject with UiObject2's AccessibilityNodeInfo
         * and finding the child elements on UiObject.
         */
        AccessibilityNodeInfo nodeInfo = AccessibilityNodeInfoGetter.fromUiObject(element);

        UiSelector uiSelector = new UiSelector();
        CustomUiSelector customUiSelector = new CustomUiSelector(uiSelector);
        uiSelector = customUiSelector.getUiSelector(nodeInfo);
        UiObject uiObject = (UiObject) CustomUiDevice.getInstance().findObject(uiSelector);
        String id = UUID.randomUUID().toString();
        AndroidElement androidElement = getAndroidElement(id, uiObject, true, by, getContextId());
        return androidElement.getChildren(selector, by);
    }
    return element.findObjects((BySelector) selector);
}
 
示例5
@Nullable
@Override
public Object getChild(final Object selector) throws UiObjectNotFoundException {
    if (selector instanceof BySelector) {
        /*
         * We can't find the child element with BySelector on UiObject,
         * as an alternative creating UiObject2 with UiObject's AccessibilityNodeInfo
         * and finding the child element on UiObject2.
         */
        AccessibilityNodeInfo nodeInfo = AccessibilityNodeInfoGetter.fromUiObject(element);
        Object uiObject2 = CustomUiDevice.getInstance().findObject(nodeInfo);
        return (uiObject2 instanceof UiObject2)
                ? ((UiObject2) uiObject2).findObject((BySelector) selector) : null;
    }
    return element.getChild((UiSelector) selector);
}
 
示例6
@Override
public List<?> getChildren(final Object selector, final By by) throws UiObjectNotFoundException {
    if (selector instanceof BySelector) {
        /*
         * We can't find the child elements with BySelector on UiObject,
         * as an alternative creating UiObject2 with UiObject's AccessibilityNodeInfo
         * and finding the child elements on UiObject2.
         */
        AccessibilityNodeInfo nodeInfo = AccessibilityNodeInfoGetter.fromUiObject(element);
        UiObject2 uiObject2 = (UiObject2) CustomUiDevice.getInstance().findObject(nodeInfo);
        if (uiObject2 == null) {
            throw new ElementNotFoundException();
        }
        return uiObject2.findObjects((BySelector) selector);
    }
    return this.getChildElements((UiSelector) selector);
}
 
示例7
public UiObject2 getElement() throws UiObjectNotFoundException {
    BySelector selector = getElementSelector();
    if (this.scrollFind == 1) {
        return getElement(selector, this.scrollCount, "up");
    } else {
        return getElement(selector, 10000);
    }
}
 
示例8
public BySelector getSelector() {
    String androidClass = getAndroidClass();

    //TODO: remove below comments once code get reviewed
    //below commented line related to UiAutomator V1(bootstrap) version, as we don't have possibility
    // in V2 version to use instance, so directly returning By.clazz
    // new UiSelector().className(androidClass).instance(Integer.parseInt(instance));
    return By.clazz(androidClass);
}
 
示例9
public static AndroidElement findElement(final BySelector ui2BySelector) throws UiAutomator2Exception {
    Object ui2Object = getInstance().findObject(ui2BySelector);
    if (ui2Object == null) {
        throw new ElementNotFoundException();
    }
    return getAndroidElement(UUID.randomUUID().toString(), ui2Object, true);
}
 
示例10
/**
 * UiDevice in android open source project will Support multi-window searches for API level 21,
 * which has not been implemented in UiAutomatorViewer capture layout hierarchy, to be in sync
 * with UiAutomatorViewer customizing getWindowRoots() method to skip the multi-window search
 * based user passed property
 */
private CustomUiDevice() {
    try {
        this.mInstrumentation = (Instrumentation) getField(UiDevice.class, FIELD_M_INSTRUMENTATION, Device.getUiDevice());
        this.API_LEVEL_ACTUAL = getField(UiDevice.class, FIELD_API_LEVEL_ACTUAL, Device.getUiDevice());
        this.ByMatcherClass = ReflectionUtils.getClass("androidx.test.uiautomator.ByMatcher");
        this.METHOD_FIND_MATCH = method(ByMatcherClass, "findMatch", UiDevice.class, BySelector.class, AccessibilityNodeInfo[].class);
        this.METHOD_FIND_MATCHES = method(ByMatcherClass, "findMatches", UiDevice.class, BySelector.class, AccessibilityNodeInfo[].class);
        this.uiObject2Constructor = UiObject2.class.getDeclaredConstructors()[0];
        this.uiObject2Constructor.setAccessible(true);
    } catch (Exception e) {
        Logger.error("Cannot create CustomUiDevice instance", e);
        throw e;
    }
}
 
示例11
@Nullable
private static BySelector toSelector(@Nullable AccessibilityNodeInfo nodeInfo) {
    if (nodeInfo == null) {
        return null;
    }
    final CharSequence className = nodeInfo.getClassName();
    return className == null ? null : By.clazz(className.toString());
}
 
示例12
/**
 * Find a view based on the prefixed text in the view. The matching is case-insensitive.
 *
 * @param text Prefix to search for.
 * @param klass Expected class of the view.
 * @return
 */
public static UiObjectMatcher withTextStartingWith(String text, Class klass) {
    UiSelector uiSelector = new UiSelector()
            .textStartsWith(text);
    BySelector bySelector = By.textStartsWith(text);

    if (klass != null) {
        uiSelector = uiSelector.className(klass);
        bySelector.clazz(klass);
    }

    return new UiObjectMatcher(uiSelector, bySelector);
}
 
示例13
/**
 * Find a view based on the text contained within the view. The matching is case-sensitive.
 *
 * @param text Text to search for inside a view.
 * @param klass Expected class of the view.
 * @return
 */
public static UiObjectMatcher withTextContaining(String text, Class klass) {
    UiSelector uiSelector = new UiSelector()
            .textContains(text);
    BySelector bySelector = By.textContains(text);

    if (klass != null) {
        uiSelector = uiSelector.className(klass);
        bySelector.clazz(klass);
    }

    return new UiObjectMatcher(uiSelector, bySelector);
}
 
示例14
/**
 * Find a view based on the exact text contained within the view. Matching is case-insensitive.
 *
 * @param text Exact text in the view.
 * @param klass Expected class of the view.
 * @return
 */
public static UiObjectMatcher withText(String text, Class klass) {
    Pattern pattern = Pattern.compile("(?i)" + Pattern.quote(text));

    UiSelector uiSelector = new UiSelector()
            .textMatches(pattern.pattern());
    BySelector bySelector = By.text(pattern);

    if (klass != null) {
        uiSelector = uiSelector.className(klass);
        bySelector.clazz(klass);
    }

    return new UiObjectMatcher(uiSelector, bySelector);
}
 
示例15
/**
 * Find a view based on the resource id. Resource ids should be the fully qualified id,
 * ex: com.android.browser:id/url
 *
 * @param id The fully qualified id of the view, ex: com.android.browser:id/url
 * @param klass Expected class of the view.
 * @return
 */
public static UiObjectMatcher withResourceId(String id, Class klass) {
    UiSelector uiSelector = new UiSelector()
            .resourceId(id);
    BySelector bySelector = By.res(id);

    if (klass != null) {
        uiSelector = uiSelector.className(klass);
        bySelector.clazz(klass);
    }

    return new UiObjectMatcher(uiSelector, bySelector);
}
 
示例16
/**
 * Find a view based on it's class.
 *
 * @param klass The class of the view to find.
 * @return
 */
public static UiObjectMatcher withClass(Class klass) {
    UiSelector uiSelector = new UiSelector()
            .className(klass);
    BySelector bySelector = By.clazz(klass);

    return new UiObjectMatcher(uiSelector, bySelector);
}
 
示例17
@Override
protected void runSelf() throws Exception {

    //Part One 输入app版本log

    PackageInfo info = InstrumentationRegistry.getContext().getPackageManager().getPackageInfo(this.getPackageName(), 0);
    String appversion = info.versionName;
    LogUtils.getInstance().info("appversion" + appversion);


    int sdk = VERSION.SDK_INT;

    if (this.clear) {
        //清掉缓存

        if (sdk < 21) {
            //清缓存待定
            LogUtils.getInstance().info("sdk版本小于api21,清缓后续处理");
        } else {

            String clearoutput = getUiDevice().executeShellCommand("pm clear " + this.getPackageName());
            LogUtils.getInstance().info("pm clear " + clearoutput);
        }
    }


    Context mContext = InstrumentationRegistry.getContext();
    Intent myIntent = mContext.getPackageManager().getLaunchIntentForPackage(this.getPackageName());
    String AppStartActivity = myIntent.getComponent().getClassName();

    if (sdk < 21) {
        //安卓版本5.0以下的启动方式
        mContext.startActivity(myIntent);

    } else {
        //安卓版本5.0以上的启动方式
        String startNoClearoutput = getUiDevice().executeShellCommand("am start -n " + this.getPackageName() + "/" + AppStartActivity);
        LogUtils.getInstance().info(startNoClearoutput);
    }

    BySelector bySelector = By.base();
    bySelector.pkg(this.getPackageName());
    getElement(bySelector, 10000);


    screenshot(TYPE_LOG_SUCCESS);

}
 
示例18
private void initListener() {

        Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
        mInstrumentation.getUiAutomation().setOnAccessibilityEventListener(
                new UiAutomation.OnAccessibilityEventListener() {
                    @Override
                    public void onAccessibilityEvent(AccessibilityEvent event) {
                        try {
                            final int eventType = event.getEventType();
                            //处理权限框
                            if (eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED && permissionsWindowHandler) {


                                //package 符合
                                final String packageName = event.getPackageName().toString();
                                if (!Pattern.matches(packages, packageName)) {
                                    return;
                                }


                                //部分机型无法获取全部的Texts,故下面部分进行注释
//                                String btnText = null;
//                                final List<CharSequence> texts = event.getText();
//                                for (CharSequence text : texts) {
//                                    if (Pattern.matches(allowButton, text)) {
//                                        btnText = text.toString();
//                                        break;
//                                    }
//                                }
//
//                                //btnText 符合
//                                if (btnText == null) {
//                                    return;
//                                }
//
//                                //文本日志
//                                LogUtils.getInstance().info("permissions window: package " + packageName
//                                        + ",text " + texts);


                                BySelector permissionsSelector = By.pkg(packageName).text(Pattern.compile(allowButton));
                                UiObject2 obj = uiDevice.findObjectOnce(permissionsSelector);
                                if (obj!= null) {

                                    //截图日志
                                    LogUtils.getInstance().infoScreenshot(new RectCanvasHandler(obj.getVisibleBounds()));
                                    obj.click();

                                }

                            } else if (eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
                                //判断是否是通知事件
                                Parcelable parcelable = event.getParcelableData();
                                //如果不是下拉通知栏消息,则为其它通知信息,包括Toast
                                if (!(parcelable instanceof Notification)) {
                                    List <CharSequence> messageList = event.getText();
                                    for (CharSequence toast_Message : messageList) {
                                        if (!TextUtils.isEmpty(toast_Message)) {
                                            for (IGlobalEventChecker toastChecker : toastCheckerSet) {
                                                toastChecker.check(toast_Message.toString());
                                            }
                                            return;
                                        }
                                    }
                                }
                            }
                        } catch (Exception ex) {
                            LogUtils.getInstance().error(ex);
                        }
                    }
                }
        );
    }
 
示例19
public BySelector getElementSelector() {
    BySelector bySelector = By.base();

    if (this.elementId != null) {
        bySelector.res(this.elementId);
    }

    if (this.elementText != null) {
        bySelector.text(this.elementText);
    }

    if (this.elementDesc != null) {
        bySelector.desc(this.elementDesc);
    }

    if (this.elementClazz != null) {
        bySelector.clazz(this.elementClazz);
    }

    if (this.elementPackage != null) {
        bySelector.pkg(this.elementPackage);
    }

    if (this.elementTextDesc != null) {
        bySelector.setCustomCheckCriteria(new customCheckCriteria(this.elementTextDesc));
    }

    //contains

    if (this.elementIdContains != null) {
        bySelector.res(containsPattern(this.elementIdContains));
    }

    if (this.elementTextContains != null) {
        bySelector.textContains(this.elementTextContains);
    }

    if (this.elementDescContains != null) {
        bySelector.descContains(this.elementDescContains);
    }

    if (this.elementClazzContains != null) {
        bySelector.clazz(containsPattern(this.elementClazzContains));
    }

    if (this.elementPackageContains != null) {
        bySelector.pkg(containsPattern(this.elementPackageContains));
    }

    if (this.elementTextDescContains != null) {
        bySelector.setCustomCheckCriteria(
                new customCheckCriteria(containsPattern(this.elementTextDescContains))
        );
    }

    //pattern

    if (this.elementIdPattern != null) {
        bySelector.res(Pattern.compile(this.elementIdPattern));
    }

    if (this.elementTextPattern != null) {
        bySelector.text(Pattern.compile(this.elementTextPattern));
    }

    if (this.elementDescPattern != null) {
        bySelector.desc(Pattern.compile(this.elementDescPattern));
    }

    if (this.elementClazzPattern != null) {
        bySelector.clazz(Pattern.compile(this.elementClazzPattern));
    }

    if (this.elementPackagePattern != null) {
        bySelector.pkg(Pattern.compile(this.elementPackagePattern));
    }

    if (this.elementTextDescPattern != null) {
        bySelector.setCustomCheckCriteria(
                new customCheckCriteria(Pattern.compile(this.elementTextDescPattern))
        );
    }

    return bySelector;
}
 
示例20
public UiObjectMatcher(UiSelector uiSelector, BySelector bySelector) {
    mUiSelector = uiSelector;
    mBySelector = bySelector;
}
 
示例21
public BySelector getBySelector() {
    return mBySelector;
}
 
示例22
/**
 * Find a view based on the content description of the view. The content-description is typically used by the
 * Android Accessibility framework to provide an audio prompt for the widget when the widget is selected.
 * The content-description for the widget must match exactly with the string in your input argument.
 * Matching is case-sensitive.
 *
 * On {@link android.os.Build.VERSION_CODES#LOLLIPOP} devices and higher than matcher can be
 * used to match views in {@link android.webkit.WebView}s and browsers.
 *
 * @param text Content description of the view.
 * @param klass Expected class of the view.
 * @return
 */
public static UiObjectMatcher withContentDescription(String text, Class klass) {
    UiSelector uiSelector = new UiSelector()
            .description(text);
    BySelector bySelector = By.desc(text);

    if (klass != null) {
        uiSelector = uiSelector.className(klass);
        bySelector.clazz(klass);
    }

    return new UiObjectMatcher(uiSelector, bySelector);
}