Appium 新手学 appium-Appium 的三种等待时间设置方法

· 2015年05月18日 · 最后由 张三 回复于 2022年02月24日 · 5604 次阅读
#三种appium设置等待时间的方法
#作者:Mr.Dantes 
#参考了网上的资料,然后进行了梳理

#第一种 sleep(): 设置固定休眠时间。 python 的 time 包提供了休眠方法 sleep() , 导入 time包后就可以使用 sleep()进行脚本的执行过程进行休眠。
#导入 time 包
import time
time.sleep()

#第二种 implicitly_wait():是 webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。如果超出了设置时间的则抛出异常。
#implicitly_wait():隐式等待
#当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常
#换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
#一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式的等到会让一个正常响应的应用的测试变慢,
#它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。

#implicitly_wait()方法比 sleep() 更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间
#范围内智能的等待。
self.driver.implicitly_wait()

#第三种  WebDriverWait():同样也是 webdirver 提供的方法。在设置时间内,默认每隔一段时间检测一次当前。页面元素是否存在,如果超过设置时间检测不到则抛出异常。
'''详细格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver - WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)
timeout - 最长超时时间,默认以秒为单位
poll_frequency - 休眠时间的间隔(步长)时间,默认为 0.5 秒
ignored_exceptions - 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。
WebDriverWait()一般由 until()或 until_not()方法配合使用,下面是 until()和 until_not()方法的说明。
until(method, message=’’)
调用该方法提供的驱动程序作为一个参数,直到返回值不为 False。
until_not(method, message=’’)
调用该方法提供的驱动程序作为一个参数,直到返回值为 False。
lambda
lambda 提供了一个运行时动态创建函数的方法。'''

from selenium.webdriver.support.ui import WebDriverWait
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(someId))
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).
until_not(lambda x: x.find_element_by_id(someId).is_displayed())
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 37 条回复 时间 点赞

感谢分享!

implicitly wait 为什么会增加正常响应的应用测试时间呢?如果 findElement 一下找到了不就不执行等待了么?

#3 楼 @shu 他的意思是当确实找不到元素时,没有 implicitly wait 时能马上 fail ,而有 implicitly wait 时必须超时才 fail 。所以慢了。

#4 楼 @chenhengjie123 这样啊,确实是

学习了

这个非常详细,非常好,多谢分享,主会保佑你长命百岁的

前两种都用过,第三种 element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”)) 没用过,但是感觉不错。感觉跟 qtp 的挺像,等待某个元素出现才可以执行下一步

第三种就是显示等待吧?!换了个马甲,差点没认出来!

有没有 java 的,怎么看到的都是 Python 的,我继续找

@mads 第三种方法能用于 android 吗?有 demo 吗?

第三种方法能用于 android 吗?有 demo 吗? 正需求呢。。

#13 · 2015年11月30日 Author

#11 楼 @520szh 可以,用法一样

#14 · 2015年11月30日 Author

#12 楼 @eblis0n 写法一样啊

element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”)) 这种方法如果要结合 IF 使用的话,有 DEMO 么?遇上难题了。另外,可以不与 try 一起使用的么?

16楼 已删除

你说的方法式 selenium 的, 在 appium 中适用吗,?

#18 · 2016年08月24日 Author

#17 楼 @jiangyong1987 。。。必须的,看标题啊哥

我试试

[该话题已被删除] 中提及了此贴 09月15日 15:08

@chenhengjie123 @mads

#第二种 implicitly_wait():是 webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。如果超出了设置时间的则抛出异常。
#implicitly_wait():隐式等待
#当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常
#换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
#一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式的等到会让一个正常响应的应用的测试变慢,
#它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。

求教一下:

#换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0

这句话是否不是很正确? 是否可以理解为,如果查找的元素没有立即出现,则隐式等待会等待指定时间;如果查找的元素立即出现了,则隐式等待结束?

而显示等待则可以实现以上说的效果?在指定时间内,会多次查看是否包含元素?

非常感谢!

#21 楼 @junewang 隐式等待和显示等待的策略都是一样的,第一次找不到元素后都会继续重试直至超时。区别是显示等待是针对特定元素,隐式等待是针对所有元素。

#22 楼 @chenhengjie123 重试的时间间隔是多少?
另外,『显示等待是针对特定元素,隐式等待是针对所有元素。』特定元素是只 untile 和 until_not 中的元素? 所有元素是指?

谢谢

#20 楼 @junewang 感觉重试时间间隔应该是可以修改的。

#23 楼 @junewang
所有元素==所有 find 的元素。因为是隐式等待,相当于在 webdriver api 的所有 find 方法里加了等待。
特定元素是指你加了显式等待的那个元素。

重试时间间隔这个没试过,不确定能不能设置。默认应该是第一次失败立即尝试第二次,直到达到超时时间。

#25 楼 @chenhengjie123 好的。谢谢 hengjie 详细讲解和帮助。

@chenhengjie123 请教一下:
我的代码如下

try:
            element = WebDriverWait(self.driver, 15).until(EC.element_to_be_clickable((By.ID,"top_level_action_about-btnInnerEl")))
except IOError:
            print("IOerror")

else:
            self.driver.find_element_by_xpath("//span[@id='top_level_action_about-btnInnerEl']").click()

我对这段代码的理解是在 15 秒内检查有没有可被点击的元素 top...,如果等待 15 秒后还没找到就 print IOError,15 秒之间检查到有的话就执行 else 后面的语句,但是为什么在实际运行的时候页面还没载入完全就直接报错提示在坐标 (xx,yy) 的元素无法被点击,else 语句不是应该在 try 没发生异常后才执行的吗?
如果想实现我设想的功能应该如何修改呢,谢谢了

#27 楼 @harjeb 额,为何 except 是捕获 IOError ?没看懂。

else 不是没发生异常才执行,而是异常没有被前面的 except 捕获就会被执行。具体怎么用建议还是看下官方相关文档吧。

@chenhengjie123 @mads 隐式等待和显式等待可以共用吗?

#29 楼 @plato79 没试过,不确定。理论上会叠加等待时间。

#30 楼 @chenhengjie123 哦哦 建议用哪种比较好呢

#31 楼 @plato79 看你需要。如果全都需要等待就隐式等待,如果只是特定地方不稳定需要等待就显式等待。

新手学 appium-合集第一季度 中提及了此贴 11月25日 17:29
陈恒捷 回复

大神,想请教一下,如果出现超时该怎么解决呢,就是报错 Timeoutexception,我自己的代码是
WebDriverWait(self.driver,10).until(EC.presence_of_element_located((MobileBy.ID,'com.sina.book:id/rb_handpick')))
self.driver.find_element_by_id('com.sina.book:id/rb_handpick').click()
这个问题快困扰我一个星期了,各种办法都试了,还是不行,跪求

陈恒捷 回复


大神,这是我的代码,确实跑不了,跪求答案

123456 回复

建议你另外开贴来问吧。把你的完整脚本、执行命令、错误信息、环境信息等都发出来。

现在是没看懂你的报错是什么。。。另外,你的代码里有个很低级的错误,就是 try 和 except 里面都有个 return 。你一 return 不就退出这个函数了么,后面的 click 还怎么执行。。。

陈恒捷 回复

大神,我开新帖了,快帮忙看看
https://testerhome.com/topics/8432

hi 请教个问题 你们在使用 appium 的显性等待和隐性等待的时候, 有没有出现过找不到元素, 然后卡住的情况? 我这边测试有一定的概率会出现卡住的情况, 超时也不报异常. 大神们知道啥情况吗?

hi:
同时设置了隐式等待和显示等待,哪个的优先级会高些?
是否可以设置隐式等待,去计算页面加载完成的时间呢?

Shuang 回复

好像是用了隐式等待,一些 JS 加载不出来 就会一直 加载 最后超时 找不到元素

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