Appium [已解决] 如何等待一个元素消失?

luoxi001713 · 2016年06月07日 · 最后由 大王命我来巡山 回复于 2016年07月14日 · 1795 次阅读

我有个 loading 的界面,我想等待这个界面消失,然后再去做动作。
loading 的界面元素是能捕获到的,但是不知道如何写方法去等待消失,我使用 Python 语言,求助各位

共收到 10 条回复 时间 点赞

给个参考思路:

做一个 for 循环,每隔一定的时间间隔就去找元素。如果抛异常(找不到)就跳出循环继续执行。

你甚至可以把找元素的操作抽取成一个参数,函数只负责在限时内一直运行直到超时或者产生指定异常。

具体源码可以参考 selenium2Library 的 wait_until_element_is_not_visible 方法:https://github.com/robotframework/Selenium2Library/blob/master/src/Selenium2Library/keywords/_waiting.py#L130

你还不如换个思路, 等待要操作的元素出现也行. 这样就是标准的 WebDriverWait 了. 这个东西跟 @chenhengjie123 提的思路是一样的.

#3 楼 @seveniruby 等待元素出现有 2 个问题,1 个是不能通用,2 是很多情况是元素出现了,在后面但是因为 loading 是灰掉的。

#4 楼 @luoxi001713 那只能用 @chenhengjie123 的办法了. 目前没有太好的方式判断元素前面是否有遮挡.

1 搂方法不错

这个界面消失之后应该有新的控件 用智能等待如何?

这个在 rf 的 appiumlib 中挺常用的,wait until page does not contian,可以参考下它的做法😄

已经实现, 非常感谢。跟大家分享一下代码

def wait_loading(self, timeout):
    self.driver.implicitly_wait(1)

    total_time = 0
    while total_time < timeout:
        try:
            time.sleep(1)
            self.View_Loading()
            total_time += 1
        except:
            break

    self.driver.implicitly_wait(10)
# 正在加载
@property
def View_Loading(self):
    if self.app_os == self.ANDROID:
        return self.driver.find_element_by_id("loading")
    elif self.app_os == self.IOS:
        return self.driver.find_element_by_accessibility_id("loading")

#9 楼 @luoxi001713 下面那个 def 干嘛的

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