aboutsummaryrefslogtreecommitdiff
path: root/src/io/appium/droiddriver/UiElement.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/io/appium/droiddriver/UiElement.java')
-rw-r--r--src/io/appium/droiddriver/UiElement.java208
1 files changed, 80 insertions, 128 deletions
diff --git a/src/io/appium/droiddriver/UiElement.java b/src/io/appium/droiddriver/UiElement.java
index a003367..aa55d09 100644
--- a/src/io/appium/droiddriver/UiElement.java
+++ b/src/io/appium/droiddriver/UiElement.java
@@ -17,9 +17,7 @@
package io.appium.droiddriver;
import android.graphics.Rect;
-
-import java.util.List;
-
+import android.view.accessibility.AccessibilityNodeInfo;
import io.appium.droiddriver.actions.Action;
import io.appium.droiddriver.actions.InputInjector;
import io.appium.droiddriver.finders.Attribute;
@@ -27,113 +25,114 @@ import io.appium.droiddriver.finders.Predicate;
import io.appium.droiddriver.instrumentation.InstrumentationDriver;
import io.appium.droiddriver.scroll.Direction.PhysicalDirection;
import io.appium.droiddriver.uiautomation.UiAutomationDriver;
+import java.util.List;
/**
* Represents an UI element within an Android App.
- * <p>
- * UI elements are generally views. Users can get attributes and perform
- * actions. Note that actions often update UiElement, so users are advised not
- * to store instances for later use -- the instances could become stale.
+ *
+ * <p>UI elements are generally views. Users can get attributes and perform actions. Note that
+ * actions often update UiElement, so users are advised not to store instances for later use -- the
+ * instances could become stale.
*/
public interface UiElement {
- /**
- * Gets the text of this element.
- */
+ /** Filters out invisible children. */
+ Predicate<UiElement> VISIBLE =
+ new Predicate<UiElement>() {
+ @Override
+ public boolean apply(UiElement element) {
+ return element.isVisible();
+ }
+
+ @Override
+ public String toString() {
+ return "VISIBLE";
+ }
+ };
+
+ /** Gets the text of this element. */
String getText();
/**
- * Gets the content description of this element.
+ * Sets the text of this element. The implementation may not work on all UiElements if the
+ * underlying view is not EditText.
+ *
+ * <p>If this element already has text, it is cleared first if the device has API 11 or higher.
+ *
+ * <p>TODO: Support this behavior on older devices.
+ *
+ * <p>The soft keyboard may be shown after this call. If the {@code text} ends with {@code '\n'},
+ * the IME may be closed automatically. If the soft keyboard is open, you can call {@link
+ * UiDevice#pressBack()} to close it.
+ *
+ * <p>If you are using {@link io.appium.droiddriver.instrumentation.InstrumentationDriver}, you
+ * may use {@link io.appium.droiddriver.actions.view.CloseKeyboardAction} to close it. The
+ * advantage of {@code CloseKeyboardAction} is that it is a no-op if the soft keyboard is hidden.
+ * This is useful when the state of the soft keyboard cannot be determined.
+ *
+ * @param text the text to enter
*/
+ void setText(String text);
+
+ /** Gets the content description of this element. */
String getContentDescription();
/**
- * Gets the class name of the underlying view. The actual name could be
- * overridden.
- *
- * @see io.appium.droiddriver.instrumentation.ViewElement#overrideClassName
+ * Gets the class name of the underlying view. The actual name could be overridden if viewed with
+ * uiautomatorviewer, which gets the name from {@link AccessibilityNodeInfo#getClassName}. If the
+ * app uses custom View classes that do not call {@link AccessibilityNodeInfo#setClassName} with
+ * the actual class name, uiautomatorviewer will report the wrong name.
*/
String getClassName();
- /**
- * Gets the resource id of this element.
- */
+ /** Gets the resource id of this element. */
String getResourceId();
- /**
- * Gets the package name of this element.
- */
+ /** Gets the package name of this element. */
String getPackageName();
- /**
- * @return whether or not this element is visible on the device's display.
- */
+ /** @return whether or not this element is visible on the device's display. */
boolean isVisible();
- /**
- * @return whether this element is checkable.
- */
+ /** @return whether this element is checkable. */
boolean isCheckable();
- /**
- * @return whether this element is checked.
- */
+ /** @return whether this element is checked. */
boolean isChecked();
- /**
- * @return whether this element is clickable.
- */
+ /** @return whether this element is clickable. */
boolean isClickable();
- /**
- * @return whether this element is enabled.
- */
+ /** @return whether this element is enabled. */
boolean isEnabled();
- /**
- * @return whether this element is focusable.
- */
+ /** @return whether this element is focusable. */
boolean isFocusable();
- /**
- * @return whether this element is focused.
- */
+ /** @return whether this element is focused. */
boolean isFocused();
- /**
- * @return whether this element is scrollable.
- */
+ /** @return whether this element is scrollable. */
boolean isScrollable();
- /**
- * @return whether this element is long-clickable.
- */
+ /** @return whether this element is long-clickable. */
boolean isLongClickable();
- /**
- * @return whether this element is password.
- */
+ /** @return whether this element is password. */
boolean isPassword();
- /**
- * @return whether this element is selected.
- */
+ /** @return whether this element is selected. */
boolean isSelected();
/**
- * Gets the UiElement bounds in screen coordinates. The coordinates may not be
- * visible on screen.
+ * Gets the UiElement bounds in screen coordinates. The coordinates may not be visible on screen.
*/
Rect getBounds();
- /**
- * Gets the UiElement bounds in screen coordinates. The coordinates will be
- * visible on screen.
- */
+ /** Gets the UiElement bounds in screen coordinates. The coordinates will be visible on screen. */
Rect getVisibleBounds();
- /**
- * @return value of the given attribute.
- */
+ /** @return value of the given attribute. */
+ @SuppressWarnings("TypeParameterUnusedInFormals")
<T> T get(Attribute attribute);
/**
@@ -144,37 +143,13 @@ public interface UiElement {
*/
boolean perform(Action action);
- /**
- * Sets the text of this element. The implementation may not work on all UiElements if the
- * underlying view is not EditText. <p> If this element already has text, it is cleared first if
- * the device has API 11 or higher. <p> TODO: Support this behavior on older devices. <p> The IME
- * (soft keyboard) may be shown after this call. If the {@code text} ends with {@code '\n'}, the
- * IME may be closed automatically. If the IME is open, you can call {@link UiDevice#pressBack()}
- * to close it. <p> If you are using {@link io.appium.droiddriver.instrumentation.InstrumentationDriver},
- * you may use {@link io.appium.droiddriver.actions.view.CloseKeyboardAction} to close it. The
- * advantage of {@code CloseKeyboardAction} is that it is a no-op if the IME is hidden. This is
- * useful when the state of the IME cannot be determined.
- *
- * @param text the text to enter
- */
- void setText(String text);
-
- /**
- * Clicks this element. The click will be at the center of the visible
- * element.
- */
+ /** Clicks this element. The click will be at the center of the visible element. */
void click();
- /**
- * Long-clicks this element. The click will be at the center of the visible
- * element.
- */
+ /** Long-clicks this element. The click will be at the center of the visible element. */
void longClick();
- /**
- * Double-clicks this element. The click will be at the center of the visible
- * element.
- */
+ /** Double-clicks this element. The click will be at the center of the visible element. */
void doubleClick();
/**
@@ -185,50 +160,27 @@ public interface UiElement {
void scroll(PhysicalDirection direction);
/**
- * Gets an immutable {@link List} of immediate children that satisfy
- * {@code predicate}. It always filters children that are null. This gives a
- * low level access to the underlying data. Do not use it unless you are sure
- * about the subtle details. Note the count may not be what you expect. For
- * instance, a dynamic list may show more items when scrolling beyond the end,
- * varying the count. The count also depends on the driver implementation:
+ * Gets an immutable {@link List} of immediate children that satisfy {@code predicate}. It always
+ * filters children that are null. This gives a low level access to the underlying data. Do not
+ * use it unless you are sure about the subtle details. Note the count may not be what you expect.
+ * For instance, a dynamic list may show more items when scrolling beyond the end, varying the
+ * count. The count also depends on the driver implementation:
+ *
* <ul>
- * <li>{@link InstrumentationDriver} includes all.</li>
- * <li>the Accessibility API (which {@link UiAutomationDriver} depends on)
- * does not include off-screen children, but may include invisible on-screen
- * children.</li>
+ * <li>{@link InstrumentationDriver} includes all.
+ * <li>the Accessibility API (which {@link UiAutomationDriver} depends on) does not include
+ * off-screen children, but may include invisible on-screen children.
* </ul>
- * <p>
- * Another discrepancy between {@link InstrumentationDriver}
- * {@link UiAutomationDriver} is the order of children. The Accessibility API
- * returns children in the order of layout (see
- * {@link android.view.ViewGroup#addChildrenForAccessibility}, which is added
- * in API16).
- * </p>
+ *
+ * <p>Another discrepancy between {@link InstrumentationDriver} {@link UiAutomationDriver} is the
+ * order of children. The Accessibility API returns children in the order of layout (see {@link
+ * android.view.ViewGroup#addChildrenForAccessibility}, which is added in API16).
*/
List<? extends UiElement> getChildren(Predicate<? super UiElement> predicate);
- /**
- * Filters out invisible children.
- */
- Predicate<UiElement> VISIBLE = new Predicate<UiElement>() {
- @Override
- public boolean apply(UiElement element) {
- return element.isVisible();
- }
-
- @Override
- public String toString() {
- return "VISIBLE";
- }
- };
-
- /**
- * Gets the parent.
- */
+ /** Gets the parent. */
UiElement getParent();
- /**
- * Gets the {@link InputInjector} for injecting InputEvent.
- */
+ /** Gets the {@link InputInjector} for injecting InputEvent. */
InputInjector getInjector();
}