UiAutomator 在 UiAutomator 中如何模拟双指滚动定位控件

暴走喵 · 2016年05月12日 · 最后由 是国国国国啊 回复于 2016年05月17日 · 2744 次阅读

以下代码段可以通过滑动查找来找到当当网:

UiScrollable appview = new UiScrollable(new UiSelector().scrollable(true));
appview.setAsHorizontalList();
UiObject openapp = appview.getChildByText(new UiSelector()
                .className(android.widget.TextView.class.getName()), "当当网"); 

但是我发现通过 UiScrollable 来寻找控件时都是单指来滑动的。现在我遇到的情况是要双指滑动才能定位到某个控件,大家有什么建议吗或者给我指个大概方向也行。

共收到 14 条回复 时间 点赞

performTwoPointerGesture

当然对象必须要是 Uiobject 而不是 Uiobject2

我现在用 UiObject2 做 drap 拖拽时候,一个 for 循环里面只能把第二个 obj 拖动一次就将结束测试了。当我想把第三个也拖动的时候已经没用了 测试结束,郁闷

#3 楼 @a372681763 问题解决了! 谢谢啊~

#3 楼 @a372681763 啥意思? 是你想拖动三个 object, 然后放到 for 循环里面。但是实际上却只给你拖动了两个吗?

#5 楼 @runaway_girl 对啊,碰到这个麻烦问题,就是在桌面我想把全部符合的应用图标拖进一个文件夹,所以用 for 循环遍历获取 child.
int count = ob.getChildCount();
for (int i = 0; i < count; i++) {
UiObject obj = ob.getChild(new UiSelector().index(i));

但是,当两个相邻的应用刚好是我要拖动的,拖动时候只能拖动第一个,到第二个的时候会跳过去 for 循环都循环不到,打印语句没有打印,但是我去掉 drapto 拖动语句时候,是全部可以打印出来的。大概我知道当拖动完一个应用时候,这是 child 的数量是动态的减少了一个的,但是我纳闷的是为啥 for 循环不到

7楼 已删除

#5 楼 @runaway_girl 上面问题是我最近遇到的一个麻烦问题,想请教你一下。跟之前回复的没关系哈,

#5 楼 @runaway_girl for (int i = 0; i < count; i++) {
UiObject obj = ob.getChild(new UiSelector().index(i));

if (null != obj) {
String txtName = obj.getText().toString();

TestHelper.e("obj text :" + txtName + ", i=" + i);
if (! TextUtils.isEmpty(txtName) && data.contains(txtName)) {
TestHelper.e(" 符合的 app:" + txtName);
list.add(obj);
if (null == r) {
r = obj.getBounds();
} else {
TestHelper.e("dragTo...");
obj.dragTo(r.centerX(), r.centerY(), STEPS);//30
Thread.sleep(SLEEP_TIME);//1000
obj.waitUntilGone(SLEEP_TIME);

}
// }
}

}

}

#9 楼 @a372681763 因为你三个应用中第一个应用被拖走之后 childCount 变成了 2, 你这时想把第二个应用拖走, 然后你执行 UiObject obj = ob.getChild(new UiSelector().index(2)); 其实这时 index 为 2 的应用是第三个应用了,所以第二个就遍历不到了。你把你代码中的 UiObject obj = ob.getChild(new UiSelector().index(i)); 在 i!=0 时修改成 UiObject obj = ob.getChild(new UiSelector().index(1)); 就可以了。这样每次拖的就是文件夹后紧跟的那个应用

int count = ob.getChildCount();
TestHelper.e(" count :" + count);
if (count > 1) {
Rect r = null;
List list = new ArrayList<>();
for (int i = 0; i < count; i++) {
UiObject obj = null;
if (i != 0)
obj = ob.getChild(new UiSelector().index(1));

else
obj = ob.getChild(new UiSelector().index(i));

if (null != obj) {

String txtName = obj.getText().toString();

TestHelper.e("obj text :" + txtName + ", i=" + i);

if (! TextUtils.isEmpty(txtName) && data.contains(txtName)) {

TestHelper.e(" 符合的 app:" + txtName);
list.add(obj);
if (null == r) {
r = obj.getBounds();
} else {
TestHelper.e("dragTo...");
obj.dragTo(r.centerX(), r.centerY(), STEPS);//30
Thread.sleep(SLEEP_TIME);//1000
obj.waitUntilGone(SLEEP_TIME);

}
}

}

}

不行哦,这样只循环到第一个,其他打印不出来。

#10 楼 @runaway_girl 我的需求就是到 home 界面把界面的除了文件夹外所有应用图标都拖动到第一个循环到的应用图标位置。碰到问题是:只要是相邻的两个要拖动的应用图标就只能拖动前一个后一个就不可以。假如一排有 5 个 app 图标,for 循环只能拿到 1,3,5 这 3 个,而 2 ,4for 循环没遍历 2 ,4 这个 2 个 app。
。。。 我知道每拖动成功一个 app 图标时候,root UiObjcet 的 child count 就会-1 ,按你说的只能循环到第一个 app 图标,其他遍历不到。

#12 楼 @a372681763 你已经跑过了吗 我写了一个是可以实现你的需求的 永远只拖文件夹后的一个 app

UiObject uiObject = new UiObject(new UiSelector().className("android.view.View").instance(3));
int count = uiObject.getChildCount();
for(int i = 0; i < count; i ++) {
    if(i == 0) {
        uiObj = uiObject.getChild(new UiSelector().index(i));   
        r = uiObj.getBounds();
    } else {
        uiObj = uiObject.getChild(new UiSelector().index(1));
    }

    if(i != 0 && uiObj.exists()) {
        uiObj.dragTo(r.centerX(), r.centerY(), 40);
        sleep(1000);
    }
}

界面是这样子的

#13 楼 @runaway_girl 恩,我那代码运行过,只获取到第一个 app 应用的信息,我想测试的是循环遍历所有 app 然后拖动符合的 app 成一个文件夹,问题是相邻的两个后一个不能循环到,

#13 楼 @runaway_girl 解决了,在拖拽完之后 i-1 就好了·

暴走喵 关闭了讨论 05月10日 10:52
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册