UIAutomator中滚动ListView获得目标TextView控件对象的经验点滴

当创建一个UiScrollable对象时,如果指定的参数是new UiSelector().scrollable(true),那么会出现以下问题

  • 当可滚动控件(比如ListView)不满一页不需要滚动时,创建的UiSrollable对象返回值是为空的。

所以以下代码是错误的:

//Find out the new added note entry
     UiScrollable noteList = new UiScrollable( new UiSelector().scrollable(true));  //would be null if the scrollable widget's not more than one page
     UiObject note = null;
     note = noteList.getChildByText(new UiSelector().className("android.widget.TextView"), "Note1", true);  
<pre name="code" class="java">     assertThat(note,notNullValue());

note.longClick();


我们可以做一个增强,当判断返回的UiScrollable对象是空的时候,我们直接去当前页面查找目标控件:

//Find out the new added note entry
     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);
     }
     else {
     	note = new UiObject(new UiSelector().text("Note1"));
     }
     assertThat(note,notNullValue());

     note.longClick();

另外一个个人认为更好的解决办法是,不要以“UiSelector().scrollable(true)”来初始化UiScrollable对象,而是明确的指定className为“android.widget.ListView"来初始化UiScrollable对象。实践证明这样子做的话就算ListView的内容很少不需要翻页时,也能够找到指定的当前页面的目标控件

//Find out the new added note entry
     UiScrollable noteList = new UiScrollable( new UiSelector().className("android.widget.ListView"));
     UiObject note = null;

     note = noteList.getChildByText(new UiSelector().className("android.widget.TextView"), "Note1", true);
     assertThat(note,notNullValue());

     note.longClick();
时间: 2024-10-24 01:59:11

UIAutomator中滚动ListView获得目标TextView控件对象的经验点滴的相关文章

Andriod ADT v22.6.2版本中在Mainactivity.java中使用fragment_main.xml中TextView控件对象的问题

众所周知,我们既可以在 activity_main.xml文件中控制activity中的view,也可以使用java代码的set..()方法控制它.在学习过程中,发现在ADT新版本中,和以前版本有区别: 新建Andriod工程后,MainActivity 不再继承Activity,而继承的是ActionBarActivity:在layout文件夹下会自动生成两个.xml文件,activity_main.xml文件和fragement_main.xml文件,和以前的版本只有一个activity_m

Android: ListView的使用(列表控件)

当程序中有大量的数据需要展示时,就需要用到 ListView 啦.ListView 允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕. 1.基本性质 (1)由于数组中的数据无法直接传递给ListView,我们需要借助适配器(Adapter)来完成.(2)Adapter有多种,需要根据ListView不同的使用情况选择不同的适配器.主要有两种ArrayAdapter / SimpleAdapter ListView的关键操作是制作一个符合要求的Adapt

ListView(1)控件架构与ArrayAdapter详解

ListView是Android开发中比较常用的一个组件,它以列表的形式展示信息,并能根据信息的长度自适应显示.比如说我们手机里的通讯录就用到了ListView显示联系人信息.在大量的场合下,我们都需要使用这个控件.虽然在Android 5.0时代,RecyclerView在很多地方都在逐渐取代ListView,但ListView的使用范围依然非常的广泛.我们也不能跳过ListView直接去学习RecyclerView,对ListView的透彻理解是十分有必要的. 首先来看ListView在Vi

定时器NSTimer放在主线程中如何解决与其他UI控件的冲突

在ios应用中  当定时器NSTimer在主线程中,可能会与其他UI控件产生冲突,比如广告栏的自动滚动,比如在当前页面中有一个textView,滚动时可能会导致定时器停止,这是为什么呢? 因为同在主线程中,系统会优先处理用户的拖动,那么就造成定时器的卡住 停止现象,怎么做呢? 需要把定时器NSTimer对象 放到 RunLoop循环中,就可以解决这个问题. [[NSRunLoop mainRunLoop]addTimer: self.timer toMode:NSRunLoopCommomMod

android课程第一节(TextView控件使用)

TextView控件使用 一.TextView基本使用(创建方式) 1.在程序中创建TextView对象 如下代码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = new TextView(this); tv.setText("你好!&qu

Android动态布局,并动态为TextView控件设置drawableLeft、drawableRight等属性添加图标

注:(图中每一个条目和图标都是由代码动态生成) 代码动态布局,并需要为每一个条目设置图标,此时用到了 android:drawableLeft="@drawable/icon"  父xml文件: [html] view plaincopyprint? <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.andr

XCODE中使用Main.Storyboard拉入控件并实现事件(Swift语言)

如何在XCODE中的Main.Storyboard内拉入控件并实现一个简单的效果呢?本人由于刚接触Swift语言不久,对于IDE的操作还是很生疏,不懂了就在网上参考了网上前辈们的文章.以下我将演示如何用Swift语言配合Main.Storyboard演示一个小例子,对于新建一个SingleView Application在这里就不多说了. 创建好的应用程序已经自动创建好了一个和Main.Storyboard连接好的ViewController. 接下来我们在Main.Storyboard中的Vi

两个TextView控件居中显示

通过一个线性布局将两个TextView控件包装在一起,设置LinearLayout的layout_centerInParent属性为true即可.代码如下 <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_centerInParent="true" android:orientation=

iOS中UITableViewController自带的刷新控件

iOS中UITableViewController自带的刷新控件 一.引言 在iOS开发中,使用tableView的界面,大多会用到一个下拉刷新的的控件,第三方库中,我们一般会选择比较好用的MJRefresh,其实,在iOS6之后,系统为我们提供了一个原生的刷新控件,使用起来非常方便,只是制定性不强,如果我们没有复杂的需求,使用UIRefreshControl也是不错的一个选择. 二.UITableViewController 相对于UIViewController,UITableViewCon