2017年6月21日 星期三

UiObject2 API





https://developer.android.com/reference/android/support/test/uiautomator/UiObject2.html


回傳值 方法名 說明
void clear() 清除物件的文字 [物件必須是editable(屬性會有focusble)]
void click() 點擊物件 [不會等待畫面更新 會立即執行下一步]
<R> R clickAndWait(EventCondition<R> condition, long timeout) 點擊後等待條件觸發 [若條件一直不觸發則使用設置的等待秒數]
void drag(Point dest) 拖曳物件到指定座標
void drag(Point dest, int speed) 拖曳物件到指定座標 [速度:每秒移動像素] [越大越快]
boolean equals(Object object) 物件是否相同
UiObject2 findObject(BySelector selector) 找尋物件 [UiObject2]
List<UiObject2> findObjects(BySelector selector) 找尋同一種多項物件 [UiObject2]
boolean fling(Direction direction, int speed) 滾動 [方向/速度:每秒移動像素] [越大越快]
boolean fling(Direction direction) 滾動 [方向]
String getApplicationPackage() 取得套件名 [來自指定物件]
int getChildCount() 取得子物件數
List<UiObject2> getChildren() 取得子物件群
String getClassName() 取得物件的類別名
String getContentDescription() 取得物件的特殊敘述
UiObject2 getParent() 取得物件的父物件
String getResourceName() 取得資源名 [resource-id]
String getText() 取得物件的文字內容
Rect getVisibleBounds() 取得物件長寬
Point getVisibleCenter() 取得物件中心點
boolean hasObject(BySelector selector) 找到指定物件時
int hashCode() 物件的哈希碼
boolean isCheckable() 是否可以被勾選
boolean isChecked() 是否被勾選
boolean isClickable() 是否可以被點擊
boolean isEnabled() 是否開啟狀態 [如果是關閉的會顯示但是灰色字樣]
boolean isFocusable() 是否可以被聚焦 [文字框常有此屬性]
boolean isFocused() 是否被聚焦 [文字聚焦時會跳出虛擬鍵盤]
boolean isLongClickable() 是否可以被長按
boolean isScrollable() 是否可以滾動
boolean isSelected() 是否可以被選擇
void longClick() 長按物件
void pinchClose(float percent) 縮小畫面的手勢 [百分比]
void pinchClose(float percent, int speed) 縮小畫面的手勢 [百分比/ 速度:每秒移動像素] [越大越快]
void pinchOpen(float percent) 放大畫面的手勢 [百分比]
void pinchOpen(float percent, int speed) 放大畫面的手勢 [百分比/ 速度:每秒移動像素] [越大越快]
void recycle() 回收物件 [被回收的物件 不能再使用 除非再一次重新找取]
boolean scroll(Direction direction, float percent, int speed) 滾動 [方向/百分比/速度:每秒移動像素] [越大越快]
boolean scroll(Direction direction, float percent) 滾動 [方向/百分比]
void setText(String text) 對此物件設定文字 [有時候不能執行 需要點擊後使用KeyCode]
void swipe(Direction direction, float percent, int speed) 滑動 [方向/百分比/速度:每秒移動像素] [越大越快] [此指手勢 如果向下 畫面會往上]
void swipe(Direction direction, float percent) 滑動 [方向/百分比] [此指手勢 如果向下 畫面會往上]
<R> R wait(SearchCondition<R> condition, long timeout) 等待某些條件達成 [條件/設定最長等待時間]
<R> R wait(UiObject2Condition<R> condition, long timeout) 等待某些條件達成 [條件/設定最長等待時間]



@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {

    // 初始化/實例化(重要)
    UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
    final String mtag="mtag";
    
    @Test
    public void apitest() throws UiObjectNotFoundException, InterruptedException {

        //Settings找到WLAN的文字點擊後 事件新的window觸發 直接往下一步 (不會等待20)
        uiDevice.findObject(By.text("WLAN")).clickAndWait(Until.newWindow(), 20000);
        //Settings找到WLAN的文字點擊後 會等待20秒才會執行下一步 (因為是等待滾動結束的事件發生 但是根本不會發生)
        uiDevice.findObject(By.text("WLAN")).clickAndWait(Until.scrollFinished(Direction.DOWN), 20000);

        //選擇可以滾動的物件且向下滾一次 (模擬滑手機一次)
        uiDevice.findObject(By.scrollable(true)).fling(Direction.DOWN, 100);

        //fling不同於並非像是用手勢滑 有可能一次到最後 這裡滑多少百分比 畫面就會向下多少百分比 (所以1代表剛好一頁的距離)
        uiDevice.findObject(By.scrollable(true)).scroll(Direction.DOWN, 0.5f);

        //取得物件長寬和中心點        
        Rect rect = uiDevice.findObject(By.res("res")).getVisibleBounds();
        Point center = uiDevice.findObject(By.res("res")).getVisibleCenter();
        Log.i(mtag, "apitest: =" + rect.height() + " =" + rect.width());
        Log.i(mtag, "apitest: 中心點(" + center.x + "," + center.y + ")");

        //判斷是有指定的物件且符合有"被聚焦"的屬性接著對此輸入文字        
        if (uiDevice.hasObject(By.desc("description"))) {
            if (uiDevice.findObject(By.desc("description")).isFocusable()) {
                uiDevice.findObject(By.desc("description")).setText("test");
            }
        }

        //蒐集相同指定的物件且都給予點擊        
        List<UiObject2> list=uiDevice.findObjects(By.text("test"));
        for(UiObject2 ui:list){
            ui.click();
        }

    }
}