diff options
Diffstat (limited to 'src/com/android/uiautomator/core/UiCollection.java')
-rw-r--r-- | src/com/android/uiautomator/core/UiCollection.java | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/com/android/uiautomator/core/UiCollection.java b/src/com/android/uiautomator/core/UiCollection.java new file mode 100644 index 0000000..e15beb2 --- /dev/null +++ b/src/com/android/uiautomator/core/UiCollection.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * 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 com.android.uiautomator.core; + +/** + * Used to enumerate a container's UI elements for the purpose of counting, + * or targeting a sub elements by a child's text or description. + * @since API Level 16 + */ +public class UiCollection extends UiObject { + + /** + * Constructs an instance as described by the selector + * + * @param selector + * @since API Level 16 + */ + public UiCollection(UiSelector selector) { + super(selector); + } + + /** + * Searches for child UI element within the constraints of this UiCollection {@link UiSelector} + * selector. + * + * It looks for any child matching the <code>childPattern</code> argument that has + * a child UI element anywhere within its sub hierarchy that has content-description text. + * The returned UiObject will point at the <code>childPattern</code> instance that matched the + * search and not at the identifying child element that matched the content description.</p> + * + * @param childPattern {@link UiSelector} selector of the child pattern to match and return + * @param text String of the identifying child contents of of the <code>childPattern</code> + * @return {@link UiObject} pointing at and instance of <code>childPattern</code> + * @throws UiObjectNotFoundException + * @since API Level 16 + */ + public UiObject getChildByDescription(UiSelector childPattern, String text) + throws UiObjectNotFoundException { + Tracer.trace(childPattern, text); + if (text != null) { + int count = getChildCount(childPattern); + for (int x = 0; x < count; x++) { + UiObject row = getChildByInstance(childPattern, x); + String nodeDesc = row.getContentDescription(); + if(nodeDesc != null && nodeDesc.contains(text)) { + return row; + } + UiObject item = row.getChild(new UiSelector().descriptionContains(text)); + if (item.exists()) { + return row; + } + } + } + throw new UiObjectNotFoundException("for description= \"" + text + "\""); + } + + /** + * Searches for child UI element within the constraints of this UiCollection {@link UiSelector} + * selector. + * + * It looks for any child matching the <code>childPattern</code> argument that has + * a child UI element anywhere within its sub hierarchy that is at the <code>instance</code> + * specified. The operation is performed only on the visible items and no scrolling is performed + * in this case. + * + * @param childPattern {@link UiSelector} selector of the child pattern to match and return + * @param instance int the desired matched instance of this <code>childPattern</code> + * @return {@link UiObject} pointing at and instance of <code>childPattern</code> + * @since API Level 16 + */ + public UiObject getChildByInstance(UiSelector childPattern, int instance) + throws UiObjectNotFoundException { + Tracer.trace(childPattern, instance); + UiSelector patternSelector = UiSelector.patternBuilder(getSelector(), + UiSelector.patternBuilder(childPattern).instance(instance)); + return new UiObject(patternSelector); + } + + /** + * Searches for child UI element within the constraints of this UiCollection {@link UiSelector} + * selector. + * + * It looks for any child matching the <code>childPattern</code> argument that has + * a child UI element anywhere within its sub hierarchy that has text attribute = + * <code>text</code>. The returned UiObject will point at the <code>childPattern</code> + * instance that matched the search and not at the identifying child element that matched the + * text attribute.</p> + * + * @param childPattern {@link UiSelector} selector of the child pattern to match and return + * @param text String of the identifying child contents of of the <code>childPattern</code> + * @return {@link UiObject} pointing at and instance of <code>childPattern</code> + * @throws UiObjectNotFoundException + * @since API Level 16 + */ + public UiObject getChildByText(UiSelector childPattern, String text) + throws UiObjectNotFoundException { + Tracer.trace(childPattern, text); + if (text != null) { + int count = getChildCount(childPattern); + for (int x = 0; x < count; x++) { + UiObject row = getChildByInstance(childPattern, x); + String nodeText = row.getText(); + if(text.equals(nodeText)) { + return row; + } + UiObject item = row.getChild(new UiSelector().text(text)); + if (item.exists()) { + return row; + } + } + } + throw new UiObjectNotFoundException("for text= \"" + text + "\""); + } + + /** + * Counts child UI element instances matching the <code>childPattern</code> + * argument. The method returns the number of matching UI elements that are + * currently visible. The count does not include items of a scrollable list + * that are off-screen. + * + * @param childPattern a {@link UiSelector} that represents the matching child UI + * elements to count + * @return the number of matched childPattern under the current {@link UiCollection} + * @since API Level 16 + */ + public int getChildCount(UiSelector childPattern) { + Tracer.trace(childPattern); + UiSelector patternSelector = + UiSelector.patternBuilder(getSelector(), UiSelector.patternBuilder(childPattern)); + return getQueryController().getPatternCount(patternSelector); + } +} |