Appium Appium 上 iOS 拖拽实现

Anson · 2014年02月24日 · 最后由 恒温 回复于 2014年02月24日 · 2806 次阅读
本帖已被设为精华帖!

上星期做测试,需要把页面中的某个位置上的东东拖到另个位置上 (同一页面)。

查看了下 python 的例子,发现有个 slider 的例子,使用的是 actiontouchactionflick 等方法,但我机器上却报错,无法运行。

大概 google 了下 touchaction 的用法,找了 1 个多小时不得其所,算了,自己用最笨的方法解决算了,用 swipe 方法搞定了。

我的需求很算单,如图。

把红色框住的 "banana"(dragable object = do) 拖放到红色框住的蓝色框 (droppable slot = ds)。

由于 do 是一个区域,ds 也是一个区域,反复试了下,最可靠的做法就是: 点击并按住 do 的中间部位,拖动 do 到 ds 的中间部位。

这其中就涉及到计算 do 和 ds 的中间部位的座标了,找到了,就拖动了:

我使用下面的方法计算 do, ds 的中间部位的座标,python, 在 unit test 中。
其中怎么找 do,和 ds 就不说了。

#drap and drop one element by 1 touch and by WebElement
def _dd_by_elem(self, startElem, endElem):
    sX = int(startElem.location['x']) + (int(startElem.size['width'])/2)
    sY = int(startElem.location['y']) + (int(startElem.size['height'])/2)
    eX = int(endElem.location['x']) + (int(endElem.size['width'])/2)
    eY = int(endElem.location['y']) + (int(endElem.size['height'])/2)

    args = {"touchCount": 1, "startX": sX, "startY": sY, "endX": eX, "endY": eY, "duration": 1.2}
    try:
        self.driver.execute_script("mobile: swipe", args)
    finally:
        pass

此中有 3 个关键点:

  • do 的点击点。如果点击并拖动在边缘上,是拖不动的,这个要看要求了,并非都是如此。
  • 放落的区间也是有要求,放在边缘上是放不进去的,这个要看要求了,并非都是如此。
  • swipe 的持续时间。duration 不能太短,尝试过 0.7 的值,发现拖不动,设置成 1 秒后有机会拖不动,所以设成了 1.2 秒,如果最后再加个检查就更好了。

这方法挺费时间的,每个拖动至少需要 1 秒钟,如果师兄有更好的方法,不妨提供出来。

这里问一个 longClick 怎么用呢?

有会的师兄请给出个代码。
谢谢。

共收到 4 条回复 时间 点赞

longClick 在安卓上实现了, ios 没实现吧?

last_image = find_elements(:tag_name, :ImageView).last
mobile(:longClick, element: last_image.ref)

@532589730 类似这样

好一个拖动,不错的思路~

#2 楼 @lihuazhang
这是 ruby?
不太会看这代码,无所谓了,现在想想用可能 swipe 也能实现,原地 swipe,把时间加长。

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