1, 測試案例
如下是一個簡單的測試案例代碼,模拟了點選Home鍵回到主屏,然後點選是以應用按鈕打開所有應用清單,
并滾動到時鐘應用。打開時鐘應用 并選擇鬧鈴界面的第一個鬧鐘設定,修改該設定的開關。
然後傳回到時鐘界面再進入倒計時界面。
import android.widget.ListView;
import android.widget.Switch;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
public class LaunchSettings extends UiAutomatorTestCase { // 繼承UiAutomatorTestCase類
public void testDemo() throws UiObjectNotFoundException {
// 模拟 HOME 鍵點選事件
getUiDevice().pressHome();
// 現在打開了主屏應用,模拟點選所有應用按鈕操作來啟動所有應用界面。
// 如果你使用了uiautomatorviewer來檢視主屏,則可以發現“所有應用”按鈕的
// content-description 屬性為“Apps”。可以使用該屬性來找到該按鈕。
UiObject allAppsButton = new UiObject(new UiSelector().description("Apps"));
// 模拟點選所有應用按鈕,并等待所有應用界面起來
allAppsButton.clickAndWaitForNewWindow();
// 在所有應用界面,時鐘應用位于Apps tab界面中。下面模拟使用者點選Apps tab操作。
// 找到 Apps tab 按鈕
UiObject appsTab = new UiObject(new UiSelector().text("Apps"));
// 模拟點選 Apps tab.
appsTab.click();
// 然後在 Apps tab界面,模拟使用者滑動到時鐘應用的操作。
// 由于Apps界面是可以滾動的,所有用
// UiScrollable 對象.
UiScrollable appViews = new UiScrollable(new UiSelector().scrollable(true));
// 設定滾動模式為水準滾動(預設為垂直滾動)
appViews.setAsHorizontalList();
if (allAppsButton.exists() && allAppsButton.isEnabled()) {
// allAppsButton在目前界面已經不可見了 是以這裡不會執行
allAppsButton.click();
}
// 查找時鐘應用并點選
UiObject settingsApp = appViews.getChildByText(
new UiSelector().className(android.widget.TextView.class.getName()), "Clock");
settingsApp.clickAndWaitForNewWindow();
// 驗證目前顯示 的應用包名為時鐘
UiObject settingsValidation = new UiObject(new UiSelector().packageName("com.google.android.deskclock"));
// 如果不存在則出錯提示
assertTrue("Unable to detect Clock", settingsValidation.exists());
// 模拟點選時間tab
UiObject clock = new UiObject(new UiSelector().description("Clock"));
clock.clickAndWaitForNewWindow();
// 模拟點選下方的鬧鐘圖示
UiObject alarms = new UiObject(new UiSelector().description("Alarms"));
alarms.clickAndWaitForNewWindow();
UiScrollable list = new UiScrollable(new UiSelector().className(ListView.class.getName()));
if (list.getChildCount() > 0) {
UiObject listIndex0 = list.getChild(new UiSelector().index(0));
UiObject switchBtn = listIndex0.getChild(new UiSelector().className(Switch.class.getName()));
boolean isChecked = switchBtn.isChecked();
switchBtn.click();
}
// 模拟點選傳回鍵
getUiDevice().pressBack();
UiObject timer = new UiObject(new UiSelector().description("Timer"));
timer.clickAndWaitForNewWindow();
}
}
2 uiautomator API
uiautomator API在 uiautomator.jar 檔案中。
UiDevice
代表裝置狀态。在測試中,可以通過UiDevice執行個體來檢測裝置的各種屬性,例如目前的螢幕方向以及螢幕尺寸。
同時還可以通過UiDevice執行個體來執行裝置級别的操作,例如 把裝置設定為橫屏或者豎屏、按下Home按鍵等。
getUiDevice().pressHome(); //模拟按下Home按鍵
UiSelector
代表一個搜尋UI控件的條件。如果發現多個滿足條件的控件則會傳回第一個控件。傳回的結果為UiObject對象。
在構造UiSelector的時候可以組合使用多個屬性來定位具體的控件。如果沒有找到控件則會抛出 UiAutomatorObjectNotFoundException 異常。
還可以使用childSelector()函數來嵌套UiSelector 對象。
例如,下面的代碼示範了如何在目前界面中查找第一個ListView中的帶有文本屬性為Apps的子控件。
UiObject appItem = new UiObject(new UiSelector()
.className("android.widget.ListView").instance(1)
.childSelector(new UiSelector().text("Apps")));
UiObject
代表一個UI控件。通過UiSelector來查找UiObject。
如下示例代碼示範了如何查找目前顯示界面中的取消按鈕和确認按鈕:
UiObject cancelButton = new UiObject(new UiSelector().text("Cancel"));
UiObject okButton = new UiObject(new UiSelector().text("OK"));
查找到的UiObject執行個體可以在其他測試代碼中重用。需要注意的是:每次使用UiObject做操作的時候uiautomator 都會在目前螢幕重新查找該控件。
在目前界面查找文本内容為“OK”的控件。如果存在并且可用則模拟使用者點選該控件。
if(okButton.exists() && okButton.isEnabled())
{
okButton.click();
}
還可以限制僅僅查找特定類型的控件。
例如 如下代碼隻查找文本為“Cancel”和“OK”的android.widget.Button類型控件。
UiObject cancelButton = new UiObject(new UiSelector().text("Cancel")
.className("android.widget.Button"));
UiObject okButton = new UiObject(new UiSelector().text("OK")
.className("android.widget.Button"));
UiCollection
代表控件的集合。擷取UiCollection的方式和UiObject一樣,通過 UiSelector查找。 UiCollection對應Android系統中的ViewGroup以及子控件。
如下代碼示範如何通過UiSelector來擷取包含視訊集合的UiCollection。
UiCollection videos = new UiCollection(new UiSelector()
.className("android.widget.FrameLayout"));
UiScrollable
代表可滾動的控件。可以用UiScrollable來模拟水準或者垂直滾動的UI元素。
如果需要操作的元素在螢幕外需要滾動螢幕才能看到的情況下需要使用UiScrollable。
例如,下面的代碼顯示了如何模拟滾動到“Settings ”菜單并點選“About tablet”菜單的操作。
UiScrollable settingsItem = new UiScrollable(new UiSelector()
.className("android.widget.ListView"));
UiObject about = settingsItem.getChildByText(new UiSelector()
.className("android.widget.LinearLayout"), "About tablet");
about.click();