UIAutomator定位Android控件的方法实践和建议(Appium姊妹篇)
原文地址:http://blog.csdn.net/zhubaitian/article/details/39777951
在本人之前的一篇文章<<Appium基于安卓的各种FindElement的控件定位方法实践和建议>>第二章节谈到Appium可以通过使用UIAutomator的方法去定位Android界面上的控件,当时只是一笔带过举了个例子。如该文给自己的承诺,今天特撰写此文以描述UIAutomator各种控件定位的方法,以作为前文的姊妹篇互通有无。
1. 背景
为了和前文达成一致,这次的实践对象同样也是使用SDK自带的NotePad应用,同样是尝试去获得在NotesList那个Activity里的Menu Options上面的那个Add note菜单选项。以下是UIAutomatorViewer对界面的一个截图.
但有一个例外的地方是下文的”通过伪xpath方法定位控件“章节实例需要使用到的是NoteEditor这个activity里面的Menu options,因为需要演示通过子控件获得父控件然后得到兄弟控件的功能,UIAutomatorViewer截图如下。
2. 通过文本信息定位
2.1 UISelector.text方法
- addNote = new UiObject(new UiSelector().text("Add note"));
- assertEquals(addNote.getText(),"Add note");
2.2. UISelector.textContains方法
- addNote = new UiObject(new UiSelector().textContains("Add"));
- assertEquals(addNote.getText(),"Add note");
2.3 UISelector.textStartsWith方法
- addNote = new UiObject(new UiSelector().textStartsWith("Add"));
- assertEquals(addNote.getText(),"Add note");
2.4 UISelector.textMatches方法
- addNote = new UiObject(new UiSelector().textMatches("^Add.*"));
- assertEquals(addNote.getText(),"Add note");
- addNote = new UiObject(new UiSelector().textMatches("^Add"));
- assertEquals(addNote.getText(),"Add note");
3 通过控件的ClassName定位
通过这种方法定位控件存在的一个问题是很容易发生重复,所以一般都是先用这种方法去narrow down目标控件,然后再去添加其他如text判断等条件进行控件定位。
3.1 UISelector.className方法
- addNote = new UiObject(new UiSelector().className("android.widget.TextView").text("Add note"));
- assertEquals(addNote.getText(),"Add note");
3.2 UISelector.classNameMatches方法
- addNote = new UiObject(new UiSelector().classNameMatches(".*TextView$"));
- assertEquals(addNote.getText(),"Add note");
4. 通过伪xpath方法定位
4.1 通过UiSelector.fromParent或UiObject.getFromParent方法
- save = new UiObject(new UiSelector().text("Save"));
- assertEquals(save.getText(),"Save");
- delete = save.getFromParent(new UiSelector().text("Delete"));
- assertEquals(delete.getText(),"Delete");
- delete = new UiObject(new UiSelector().text("Save").fromParent(new UiSelector().text("Delete")));
- assertEquals(delete.getText(),"Delete");
4.2 通过UiSelector.childSelector或UiObject.getChild方法
- UiObject parentView = new UiObject(new UiSelector().className("android.view.View"));
- save = parentView.getChild(new UiSelector().text("Save"));
- assertEquals(save.getText(),"Save");
- save = new UiObject(new UiSelector().className("android.view.View").childSelector(new UiSelector().text("Save")));
- assertEquals(save.getText(),"Save");
5. 通过控件ID定位
5.1 UiSelector.resourceId方法
- addNote = new UiObject(new UiSelector().resourceId("android:id/title"));
- assertEquals(addNote.getText(),"Add note");
5.2 UiSelector.resourceIdMatches方法
- addNote = new UiObject(new UiSelector().resourceIdMatches(".+id/title"));
- assertEquals(addNote.getText(),"Add note");
6. 通过contentDescription定位
- 有些控件使用其他办法很难或者根本没有办法定位
- 最重要的是给每个控件的contentDescription设计个唯一值让我们可以非常快速的定位控件,让我们足够敏捷!
6.1 UiSelector.description方法
- addNote = new UiObject(new UiSelector().description("AddNoteMenuDesc));
- assertEquals(addNote.getText(),"Add note");
- </pre><h2>6.2 UiSelector.descriptionContains方法</h2></div><div><pre name="code" class="java"> addNote = new UiObject(new UiSelector().descriptionContains("AddNote"));
- assertEquals(addNote.getText(),"Add note");
6.3 UiSelector.descriptionStartWith方法
- addNote = new UiObject(new UiSelector().descriptionStartsWith("AddNote"));
- assertEquals(addNote.getText(),"Add note");
6.4 UiSelector.descriptionMatches方法
- //addNote = new UiObject(new UiSelector().descriptionMatches("^AddNote.*$"));
- //assertEquals(addNote.getText(),"Add note");
7.通过其他方法定位
除了以上比较常用的方法外,UIAutomator还支持其他一些方法,比如根据控件属性是否可点击可聚焦可长按等来缩小要定位的控件的范围,具体使用方法不一一列举,可以查看以下测试验证代码。- package majcit.com.UIAutomatorDemo;
- import com.android.uiautomator.core.UiDevice;
- 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;
- import static org.hamcrest.Matchers.*;
- import static org.hamcrest.MatcherAssert.assertThat;
- public class UISelectorFindElementTest extends UiAutomatorTestCase {
- public void testDemo() throws UiObjectNotFoundException {
- UiDevice device = getUiDevice();
- device.pressHome();
- // Start Notepad
- UiObject appNotes = new UiObject(new UiSelector().text("Notes"));
- appNotes.click();
- //Sleep 3 seconds till the app get ready
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- //Evoke the system menu option
- device.pressMenu();
- UiObject addNote = new UiObject(new UiSelector().text("Add note"));
- assertEquals(addNote.getText(),"Add note");
- addNote = new UiObject (new UiSelector().checked(false).clickable(true));
- assertEquals(addNote.getText(),"Add note");
- addNote = new UiObject(new UiSelector().className("android.widget.TextView").text("Add note"));
- assertEquals(addNote.getText(),"Add note");
- addNote = new UiObject(new UiSelector().classNameMatches(".*TextView$"));
- assertEquals(addNote.getText(),"Add note");
- //addNote = new UiObject(new UiSelector().description("AddNoteMenuDesc));
- //assertEquals(addNote.getText(),"Add note");
- //addNote = new UiObject(new UiSelector().descriptionContains("AddNote"));
- //assertEquals(addNote.getText(),"Add note");
- //addNote = new UiObject(new UiSelector().descriptionStartsWith("AddNote"));
- //assertEquals(addNote.getText(),"Add note");
- //addNote = new UiObject(new UiSelector().descriptionMatches("^AddNote.*$"));
- //assertEquals(addNote.getText(),"Add note");
- addNote = new UiObject(new UiSelector().focusable(true).text("Add note"));
- assertEquals(addNote.getText(),"Add note");
- addNote = new UiObject(new UiSelector().focused(false).text("Add note"));
- assertEquals(addNote.getText(),"Add note");
- //TBD
- //addNote = new UiObject(new UiSelector().fromParent(selector))
- addNote = new UiObject(new UiSelector().index(0).text("Add note"));
- assertEquals(addNote.getText(),"Add note");
- addNote = new UiObject(new UiSelector().className("android.widget.TextView").enabled(true).instance(0));
- assertEquals(addNote.getText(),"Add note");
- addNote = new UiObject(new UiSelector().longClickable(false).text("Add note"));
- assertEquals(addNote.getText(),"Add note");
- addNote = new UiObject(new UiSelector().text("Add note"));
- assertEquals(addNote.getText(),"Add note");
- addNote = new UiObject(new UiSelector().textContains("Add"));
- assertEquals(addNote.getText(),"Add note");
- addNote = new UiObject(new UiSelector().textStartsWith("Add"));
- assertEquals(addNote.getText(),"Add note");
- addNote = new UiObject(new UiSelector().textMatches("Add.*"));
- assertEquals(addNote.getText(),"Add note");
- addNote = new UiObject(new UiSelector().resourceId("android:id/title"));
- assertEquals(addNote.getText(),"Add note");
- addNote = new UiObject(new UiSelector().resourceIdMatches(".+id/title"));
- assertEquals(addNote.getText(),"Add note");
- //Go to the editor activity, need to cancel menu options first
- device.pressMenu();
- //Find out the new added note entry
- UiScrollable noteList = new UiScrollable( new UiSelector().className("android.widget.ListView"));
- //UiScrollable noteList = new UiScrollable( new UiSelector().scrollable(true));
- UiObject note = null;
- if(noteList.exists()) {
- note = noteList.getChildByText(new UiSelector().className("android.widget.TextView"), "Note1", true);
- //note = noteList.getChildByText(new UiSelector().text("Note1"), "Note1", true);
- }
- else {
- note = new UiObject(new UiSelector().text("Note1"));
- }
- assertNotNull(note);
- //Go to the NoteEditor activity
- note.click();
- device.pressMenu();
- UiObject save = null;
- UiObject delete = null;
- save = new UiObject(new UiSelector().text("Save"));
- assertEquals(save.getText(),"Save");
- delete = save.getFromParent(new UiSelector().text("Delete"));
- assertEquals(delete.getText(),"Delete");
- delete = new UiObject(new UiSelector().text("Save").fromParent(new UiSelector().text("Delete")));
- assertEquals(delete.getText(),"Delete");
- save = new UiObject(new UiSelector().className("android.view.View").childSelector(new UiSelector().text("Save")));
- assertEquals(save.getText(),"Save");
- UiObject parentView = new UiObject(new UiSelector().className("android.view.View"));
- save = parentView.getChild(new UiSelector().text("Save"));
- assertEquals(save.getText(),"Save");
- }
- }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。