/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.appium.android.bootstrap; import com.android.uiautomator.core.UiSelector; import org.json.JSONArray; import org.json.JSONException; import java.util.ArrayList; import java.util.List; // Constants from // https://android.googlesource.com/platform/frameworks/testing/+/master/uiautomator/library/core-src/com/android/uiautomator/core/UiSelector.java public class Dynamic { // static final int SELECTOR_NIL = 0; // nothing. /** text(String text) */ private static final int SELECTOR_TEXT = 1; /** textStartsWith(String text) */ private static final int SELECTOR_START_TEXT = 2; /** textContains(String text) */ private static final int SELECTOR_CONTAINS_TEXT = 3; /** className(String className), className(Class<T> type) */ private static final int SELECTOR_CLASS = 4; /** description(String desc) */ private static final int SELECTOR_DESCRIPTION = 5; /** descriptionStartsWith(String desc) */ private static final int SELECTOR_START_DESCRIPTION = 6; /** descriptionContains(String desc) */ private static final int SELECTOR_CONTAINS_DESCRIPTION = 7; /** index(final int index) */ private static final int SELECTOR_INDEX = 8; /** instance(final int instance) */ private static final int SELECTOR_INSTANCE = 9; /** enabled(boolean val) */ private static final int SELECTOR_ENABLED = 10; /** focused(boolean val) */ private static final int SELECTOR_FOCUSED = 11; /** focusable(boolean val) */ private static final int SELECTOR_FOCUSABLE = 12; /** scrollable(boolean val) */ private static final int SELECTOR_SCROLLABLE = 13; /** clickable(boolean val) */ private static final int SELECTOR_CLICKABLE = 14; /** checked(boolean val) */ private static final int SELECTOR_CHECKED = 15; /** selected(boolean val) */ private static final int SELECTOR_SELECTED = 16; // static final int SELECTOR_ID = 17; // nothing. /** packageName(String name) */ private static final int SELECTOR_PACKAGE_NAME = 18; // @formatter:off // private static final int SELECTOR_CHILD = 19; // childSelector(UiSelector selector) // private static final int SELECTOR_CONTAINER = 20; // containerSelector(UiSelector selector) // private static final int SELECTOR_PATTERN = 21; // ! private ! patternSelector(UiSelector selector) // private static final int SELECTOR_PARENT = 22; // fromParent(UiSelector selector) // private static final int SELECTOR_COUNT = 23; // nothing. // @formatter:on /** longClickable(boolean val) */ private static final int SELECTOR_LONG_CLICKABLE = 24; /** textMatches(String regex) */ private static final int SELECTOR_TEXT_REGEX = 25; /** classNameMatches(String regex) */ private static final int SELECTOR_CLASS_REGEX = 26; /** descriptionMatches(String regex) */ private static final int SELECTOR_DESCRIPTION_REGEX = 27; /** packageNameMatches(String regex) */ private static final int SELECTOR_PACKAGE_NAME_REGEX = 28; /** resourceId(String id) */ private static final int SELECTOR_RESOURCE_ID = 29; /** checkable(boolean val) */ private static final int SELECTOR_CHECKABLE = 30; /** resourceIdMatches(String regex) */ private static final int SELECTOR_RESOURCE_ID_REGEX = 31; // start internal methods at 100 /** * Gets name (content desc) with a fall back to text if name is empty. * * getStringAttribute("name") */ private static final int GET_NAME = 100; public static String finalize(final AndroidElement result, final int finalizer) throws Exception { // Invoke the int 100+ method on the resulting element. String value = ""; switch (finalizer) { case GET_NAME: value = result.getStringAttribute("name"); break; default: break; } return value; } public static List<String> finalize( final List<AndroidElement> elements, final int finalizer) throws Exception { final ArrayList<String> results = new ArrayList<String>(); for (final AndroidElement e : elements) { final String result = finalize(e, finalizer); Logger.debug("Adding: " + result); results.add(result); } return results; } private UiSelector s = new UiSelector(); public UiSelector get(final JSONArray array) throws JSONException { // Reset selector. s = new UiSelector(); // Example pair. // Find everything containing the text sign. // [ [3, 'sign'] ] for (int a = 0; a < array.length(); a++) { final JSONArray pair = array.getJSONArray(a); final int int0 = pair.getInt(0); if (int0 >= 100) { // 100+ are finalizers only. continue; } final Object param1 = pair.get(1); Logger.debug("Updating " + int0 + ", " + param1); update(int0, param1); } return s; } private void update(final int method, final Object param) { switch (method) { case SELECTOR_TEXT: s = s.text((String) param); break; case SELECTOR_START_TEXT: s = s.textStartsWith((String) param); break; case SELECTOR_CONTAINS_TEXT: s = s.textContains((String) param); break; case SELECTOR_CLASS: s = s.className((String) param); break; case SELECTOR_DESCRIPTION: s = s.description((String) param); break; case SELECTOR_START_DESCRIPTION: s = s.descriptionStartsWith((String) param); break; case SELECTOR_CONTAINS_DESCRIPTION: s = s.descriptionContains((String) param); break; case SELECTOR_INDEX: s = s.index((Integer) param); break; case SELECTOR_INSTANCE: s = s.instance((Integer) param); break; case SELECTOR_ENABLED: s = s.enabled((Boolean) param); break; case SELECTOR_FOCUSED: s = s.focused((Boolean) param); break; case SELECTOR_FOCUSABLE: s = s.focusable((Boolean) param); break; case SELECTOR_SCROLLABLE: s = s.scrollable((Boolean) param); break; case SELECTOR_CLICKABLE: s = s.clickable((Boolean) param); break; case SELECTOR_CHECKED: s = s.checked((Boolean) param); break; case SELECTOR_SELECTED: s = s.selected((Boolean) param); break; case SELECTOR_PACKAGE_NAME: s = s.packageName((String) param); break; case SELECTOR_LONG_CLICKABLE: s = s.longClickable((Boolean) param); break; case SELECTOR_TEXT_REGEX: s = s.textMatches((String) param); break; case SELECTOR_CLASS_REGEX: s = s.classNameMatches((String) param); break; case SELECTOR_DESCRIPTION_REGEX: s = s.descriptionMatches((String) param); break; case SELECTOR_PACKAGE_NAME_REGEX: s = s.packageNameMatches((String) param); break; case SELECTOR_RESOURCE_ID: s = s.resourceId((String) param); break; case SELECTOR_CHECKABLE: s = s.checkable((Boolean) param); break; case SELECTOR_RESOURCE_ID_REGEX: s = s.resourceIdMatches((String) param); break; default: break; } } }