| /* |
| * Copyright (C) 2013 DroidDriver committers |
| * |
| * 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 io.appium.droiddriver; |
| |
| import android.graphics.Rect; |
| |
| import java.util.List; |
| |
| import io.appium.droiddriver.actions.Action; |
| import io.appium.droiddriver.actions.InputInjector; |
| import io.appium.droiddriver.finders.Attribute; |
| 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; |
| |
| /** |
| * 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. |
| */ |
| public interface UiElement { |
| /** |
| * Gets the text of this element. |
| */ |
| String getText(); |
| |
| /** |
| * 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 |
| */ |
| String getClassName(); |
| |
| /** |
| * Gets the resource id of this element. |
| */ |
| String getResourceId(); |
| |
| /** |
| * Gets the package name of this element. |
| */ |
| String getPackageName(); |
| |
| /** |
| * @return whether or not this element is visible on the device's display. |
| */ |
| boolean isVisible(); |
| |
| /** |
| * @return whether this element is checkable. |
| */ |
| boolean isCheckable(); |
| |
| /** |
| * @return whether this element is checked. |
| */ |
| boolean isChecked(); |
| |
| /** |
| * @return whether this element is clickable. |
| */ |
| boolean isClickable(); |
| |
| /** |
| * @return whether this element is enabled. |
| */ |
| boolean isEnabled(); |
| |
| /** |
| * @return whether this element is focusable. |
| */ |
| boolean isFocusable(); |
| |
| /** |
| * @return whether this element is focused. |
| */ |
| boolean isFocused(); |
| |
| /** |
| * @return whether this element is scrollable. |
| */ |
| boolean isScrollable(); |
| |
| /** |
| * @return whether this element is long-clickable. |
| */ |
| boolean isLongClickable(); |
| |
| /** |
| * @return whether this element is password. |
| */ |
| boolean isPassword(); |
| |
| /** |
| * @return whether this element is selected. |
| */ |
| boolean isSelected(); |
| |
| /** |
| * 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. |
| */ |
| Rect getVisibleBounds(); |
| |
| /** |
| * @return value of the given attribute. |
| */ |
| <T> T get(Attribute attribute); |
| |
| /** |
| * Executes the given action. |
| * |
| * @param action the action to execute |
| * @return true if the action is successful |
| */ |
| 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. |
| */ |
| void click(); |
| |
| /** |
| * 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. |
| */ |
| void doubleClick(); |
| |
| /** |
| * Scrolls in the given direction. |
| * |
| * @param direction specifies where the view port will move instead of the finger |
| */ |
| 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: |
| * <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> |
| * </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> |
| */ |
| 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. |
| */ |
| UiElement getParent(); |
| |
| /** |
| * Gets the {@link InputInjector} for injecting InputEvent. |
| */ |
| InputInjector getInjector(); |
| } |