Home | History | Annotate | Download | only in droiddriver
      1 /*
      2  * Copyright (C) 2013 DroidDriver committers
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.google.android.droiddriver;
     18 
     19 import android.graphics.Rect;
     20 
     21 import com.google.android.droiddriver.actions.Action;
     22 import com.google.android.droiddriver.actions.ScrollDirection;
     23 import com.google.android.droiddriver.exceptions.ElementNotVisibleException;
     24 import com.google.android.droiddriver.finders.Attribute;
     25 import com.google.android.droiddriver.instrumentation.InstrumentationDriver;
     26 import com.google.android.droiddriver.uiautomation.UiAutomationDriver;
     27 import com.google.common.base.Predicate;
     28 
     29 import java.util.List;
     30 
     31 /**
     32  * Represents an UI element within an Android App.
     33  * <p>
     34  * UI elements are generally views. Users can get attributes and perform
     35  * actions. Note that actions often update UiElement, so users are advised not
     36  * to store instances for later use -- the instances could become stale.
     37  */
     38 public interface UiElement {
     39   /**
     40    * Gets the text of this element.
     41    */
     42   String getText();
     43 
     44   /**
     45    * Gets the content description of this element.
     46    */
     47   String getContentDescription();
     48 
     49   /**
     50    * Gets the class name of the underlying view. The actual name could be
     51    * overridden.
     52    *
     53    * @see com.google.android.droiddriver.instrumentation.ViewElement#overrideClassName
     54    */
     55   String getClassName();
     56 
     57   /**
     58    * Gets the resource id of this element.
     59    */
     60   String getResourceId();
     61 
     62   /**
     63    * Gets the package name of this element.
     64    */
     65   String getPackageName();
     66 
     67   /**
     68    * @return whether or not this element is visible on the device's display.
     69    */
     70   boolean isVisible();
     71 
     72   /**
     73    * @return whether this element is checkable.
     74    */
     75   boolean isCheckable();
     76 
     77   /**
     78    * @return whether this element is checked.
     79    */
     80   boolean isChecked();
     81 
     82   /**
     83    * @return whether this element is clickable.
     84    */
     85   boolean isClickable();
     86 
     87   /**
     88    * @return whether this element is enabled.
     89    */
     90   boolean isEnabled();
     91 
     92   /**
     93    * @return whether this element is focusable.
     94    */
     95   boolean isFocusable();
     96 
     97   /**
     98    * @return whether this element is focused.
     99    */
    100   boolean isFocused();
    101 
    102   /**
    103    * @return whether this element is scrollable.
    104    */
    105   boolean isScrollable();
    106 
    107   /**
    108    * @return whether this element is long-clickable.
    109    */
    110   boolean isLongClickable();
    111 
    112   /**
    113    * @return whether this element is password.
    114    */
    115   boolean isPassword();
    116 
    117   /**
    118    * @return whether this element is selected.
    119    */
    120   boolean isSelected();
    121 
    122   /**
    123    * Gets the UiElement bounds in screen coordinates. The coordinates may not be
    124    * visible on screen.
    125    */
    126   Rect getBounds();
    127 
    128   /**
    129    * Gets the UiElement bounds in screen coordinates. The coordinates will be
    130    * visible on screen.
    131    */
    132   Rect getVisibleBounds();
    133 
    134   /**
    135    * @return value of the given attribute.
    136    */
    137   <T> T get(Attribute attribute);
    138 
    139   /**
    140    * Executes the given action.
    141    *
    142    * @param action The action to execute
    143    * @throws ElementNotVisibleException when the element is not visible
    144    * @return true if the action is successful
    145    */
    146   boolean perform(Action action);
    147 
    148   /**
    149    * Sets the text of this element.
    150    *
    151    * @param text The text to enter.
    152    * @throws ElementNotVisibleException when the element is not visible
    153    */
    154   // TODO: Should this clear the text before setting?
    155   void setText(String text);
    156 
    157   /**
    158    * Clicks this element. The click will be at the center of the visible
    159    * element.
    160    *
    161    * @throws ElementNotVisibleException when the element is not visible
    162    */
    163   void click();
    164 
    165   /**
    166    * Long-clicks this element. The click will be at the center of the visible
    167    * element.
    168    *
    169    * @throws ElementNotVisibleException when the element is not visible
    170    */
    171   void longClick();
    172 
    173   /**
    174    * Double-clicks this element. The click will be at the center of the visible
    175    * element.
    176    *
    177    * @throws ElementNotVisibleException when the element is not visible
    178    */
    179   void doubleClick();
    180 
    181   /**
    182    * Scrolls in the given direction. Scrolling down means swiping upwards.
    183    */
    184   void scroll(ScrollDirection direction);
    185 
    186   /**
    187    * Gets an immutable {@link List} of immediate children that satisfy
    188    * {@code predicate}. It always filters children that are null.
    189    */
    190   List<UiElement> getChildren(Predicate<? super UiElement> predicate);
    191 
    192   /**
    193    * Filters out invisible children.
    194    */
    195   Predicate<UiElement> VISIBLE = new Predicate<UiElement>() {
    196     @Override
    197     public boolean apply(UiElement element) {
    198       return element.isVisible();
    199     }
    200 
    201     @Override
    202     public String toString() {
    203       return "VISIBLE";
    204     }
    205   };
    206 
    207   // TODO: remove getChildCount and getChild.
    208   /**
    209    * Gets the child at given index.
    210    */
    211   UiElement getChild(int index);
    212 
    213   /**
    214    * Gets the child count. This gives a low level access to the underlying data.
    215    * Do not use it unless you are sure about the subtle details. Note the count
    216    * may not be what you expect. For instance, a dynamic list may show more
    217    * items when scrolling beyond the end, varying the count. The count also
    218    * depends on the driver implementation:
    219    * <ul>
    220    * <li>{@link InstrumentationDriver} includes all.</li>
    221    * <li>the Accessibility API (which {@link UiAutomationDriver} depends on)
    222    * does not include off-screen children, but may include invisible on-screen
    223    * children.</li>
    224    * </ul>
    225    */
    226   int getChildCount();
    227 
    228   /**
    229    * Gets the parent.
    230    */
    231   UiElement getParent();
    232 }
    233