Appium scrollTo 方法的一些问题

Shuang · 2015年08月06日 · 最后由 陈恒捷 回复于 2016年11月28日 · 2348 次阅读

我目前在做安卓手机应用的 ui test,发现 scrollTo 方法有些不便于使用的地方:

安卓下 scrollTo 方法,根据文档:该方法传 string text 参数,通过找元素的 text 或 content description 去滚动到对应元素,并且只能在第一个 scrollView 里起作用。

但是我觉得只能在第一个 scrollView 里用很限制啊,如果我想在页面上第二个 scrollView 上 scroll 就不可以了,而且这个 scrollView 我感觉它指的应该是 scrollable view 吧,因为实际应用中在 spinner 上也可以用,如果这个 spinner 的 scrollable 属性是 true 的话。
看源码第一个 scrollView 是 hard code 的,这样真的好么。。。

static String UiScrollable(String uiSelector) {
    return "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(" + uiSelector + ".instance(0));";
  }

第二个不方便是只能通过 text 查找,但是一个应用中的 text 总是会变,要经常去维护测试用例。如果能通过元素的 id 查找并滚动到相应元素,这样不是更方便?因为一个元素的 id 相对固定不会经常改变。

第三就是如果直接修改 appium 的源码,为我所用,在实际中是不是一个好的实践呢?

以上是我用了 appium 一段时间的想法,请高手指点这些观点是否可行,有什么其他方法可以实现类似的功能。谢谢大家!

共收到 18 条回复 时间 点赞

5.0 以后的 Android 你就知道他的用处了

#1 楼 @lanxiangtechnical 愿闻其详!能详细解释一下吗?

#2 楼 @shu 那个 hard code 是在哪看到的

自己封装去自定义啊~
UiScrollable 用起来灵活着呢。
除了有些 API 无法使用以外

#2 楼 @shu 同问,印象中 scrollTo 传的是 element.id ,不是 text 啊。不过不知道你的 scrollTo 和我们理解的是不是同一个?
我说的是这个:
http://appium.io/slate/en/master/?python#scroll-to

另外,通过 id 查找这个其实局限性更大,因为一般情况下 scrollView 中的元素使用的 resource-id 是一样的。

实际实践中应该是支持多种定位方式(id, text, xpath 等)。

#2 楼 @shu 另外,麻烦添加一下头像,谢谢。

Shuang #10 · 2015年08月06日 Author

#5 楼 @chenhengjie123 懵了,你说的 scrollTo 和我链接里的那个有什么不同?

#9 楼 @shu 明白了,我的 scrollTo 是 server 封装的,client 只负责发命令,好处是不仅能支持 Android(不过有点问题),还能支持 iOS 。
你的 scrollTo 是 Java-client 自己基于 UIAutomator API 封装的 scrollTo ,是这个 client 特有的方法。

Java 使用 server 封装的 scrollTo 的方法如下:

// java
WebElement element = driver.findElement(By.name("Element Name"));
HashMap<String, String> arguments = new HashMap<String, String>();
arguments.put("element", element.getId());
(JavascriptExecutor)driver.executeScript("mobile: scrollTo", arguments);

#10 楼 @chenhengjie123

好处是不仅能支持 Android(不过有点问题)是什么问题?
感觉楼主说的貌似没错,看代码那么写,如果有第二个 scrollview 那就滑动不了了?

Shuang #13 · 2015年08月07日 Author

#11 楼 @zsx10110 是的,只能滑动第一个

Shuang #14 · 2015年08月07日 Author

#10 楼 @chenhengjie123 这个代码我也看见过,但是不太清楚怎么用,代码里的 driver 是 appium driver 还是什么 driver 都可以呢?

Shuang #14 · 2015年08月07日 Author

#10 楼 @chenhengjie123 另外对于安卓,Element Name 里面的 name 指的是什么,安卓元素没有 name 属性啊

#11 楼 @zsx10110 问题就是在 android 上用不了。
对于 android 底层使用的 UIAutomator,至少需要知道 scrollView 和需要查找的元素的 text ,但这个 API 只传了需要查找元素的 text ,没有 scrollView 。appium 应该要通过控件树自动找到 element 所在的 scrollable view,然后把它传给 UIAutomator 。
对于 iOS 的 UIAutomation,因为 UIAutomation API 直接有个 scrollToVisible 的方法可以不传 scrollView ,所以可以直接使用。

#14 楼 @shu element name 指的是 content-desc 或者 text 属性。
可以看下我以前的这个帖子:关于 appium get_attribute 方法的坑
实际上只需要给个 element.id 就够了,appium 不仅支持 byName,也支持 byXpath,byId 等。只是在 android 上由于隐藏元素在控件树上不可见,所以在 findElement 的时候就会出错了。

我后面发个帖子专门说下这个 scrollTo 吧。

#16 楼 @chenhengjie123 求问关于这个 scrollTo 后续有出专门的贴子么?

#17 楼 @aya 木有,后续没那么关注 appium 了。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册