Appium 请教实现在一个列表找指定客户,找不到则向上滑,直至找到然后点击

匿名 · 2017年02月09日 · 1208 次阅读

想实现在客户列表中中循环指定客户 A,第一页没有则向上滑,直至找到客户 A 然后点击选中
用了 try except 但是无法实现循环的效果

try :
      self.assertTrue(self.driver.find_element_by_name(u'客户A'),msg=u'没找到客户')
      public.get_name(u'客户A').click()
except:
      public.swipe_up()

试着加了循环后,无法跳出

for i in range(5):
  try :
        self.assertTrue(self.driver.find_element_by_name(u'客户A'),msg=u'没找到客户')
        public.get_name(u'客户A').click()
  except:
        public.swipe_up()

请教 该如何解决

共收到 8 条回复 时间 点赞
while True:
    try :
        self.assertTrue(self.driver.find_element_by_name(u'客户A'),msg=u'没找到客户')
        public.get_name(u'客户A').click()
        break
    except:
        str1=public.getPageSource()
        public.swipe_up()
        time.sleep(2)
        str2=public.getPageSource()
        #是否滑动到底部
        if str1==str2:
            break

我觉得你这个思路不对:

  • 首先 Python 里 try...except 是用来处理异常的,没看见这个元素怎么能算是异常;
  • 如果是一张长列表,只是下面部分看不见(不知我理解对不对),你用findElementByName()是可以找到该元素,但是无法点击,因为该元素不在可见区域。

wd 中有个方法是isDisplayed(),可以判断所需元素是否可见,可见则点击,看不见则下滑,以下是个 node 的例子:

let element, flag = true;
while(true) {
  element = yield driver.elementByName('客户A').isDisplayed();
  if (element) {
    yield driver.elementByName('客户A').click();
    flag = false;
  } else {
    yield driver.swipe_up();
  }
}

@Cononico 此可见非比可见

这样循环存在问题,如果填写一个不存在的用户,那么这个循环就是死循环,其次如果只有列表内容比较少,只有两页内容,那么在最后一页就会一直循环无法跳出,滑动之前应该记录一下列表中第一个用户名(如果存在相同的用户,可以多存几个用户名,或者其他标志性的)滑动完成之后,显示的内容进行对比有没有变化,如果没有变化,说明滑动到最后,此时然后将 flag 置 false 即可。

匿名 #5 · 2017年02月10日

#1 楼 @xiaoj Thanks 测试有效

昨天我试了这种方法也是可行的,分享一下

i=0
while i<5:
        a=self.driver.find_elements_by_name(u'客户A')
        if len(a)>0:
            public.get_name(u'客户A').click()
            break
        else:
            public.swipe_up()
        i=i+1
匿名 在 [求助] 如何判断某元素是否在当前视图内 中提及了此贴 02月13日 16:55

@NJ-zero 前提条件是你知道这个列表总共有几页,如果不知道呢,怎么判断滑到最后一页?

匿名 #8 · 2017年02月18日

#7 楼 @si509429 那就把 i<5 改成 i<500 或者更大 或者 l 楼的方法也可以

while 1 > 0:
    try:
        self.driver.find_elements_by_name(u'客户A').click
        break
    except:
        向下滑动()

这样 driver.find_elements_by_name(u'客户 A') 没找到会报错 就不会执行 break 而是 向下滑动,找到点击成功以后就 break 。或者循环你可以自己再改改。

py 的 uiautomator 有.exists 方法
d(text="不存在的控件").exists,会返回 True / False
这样循环 if 就可以更方便的解决了

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