纠结这个问题一天多,找了不少资料,发现众说纷纭,后来自己做了对比分析与实测,现在把个人的理解说一下:
假设,隐式等待设置为:driver.implicitly_wait(10)
显示等待设置为:WebDriverWait(10).until(后略) #都是设置了10秒
(1) 那么首先得理解10秒是从什么时候开始算起的:当我们点击运行程序,页面弹开,这时候得等到页面全部加载完成才能开始计时(有时候网速不好或者卡顿都会影响加载),这个计时原则对隐式或显式等待都是一样的。接下来,先谈隐式等待,不管你要找的元素有几个,它们到底存不存在,都必须先等页面全部加载完成,否则它坚决不找,加载完成了,那就开始计时,开始查找你要的第一个元素,如果在规定时间内找到了,停止计时,进行下一步操作(比如click,比如send_keys等等),接着,开始找你要的第二个元素,重新开始计时。
注意:如果要找的某个元素在规定的10秒内没有找到,则抛出异常,NoSuchElementExcepction。还要记得,隐式等待对每一次的查找元素都有效(类似于一劳永逸)。
(3)接下来,谈显式等待,显式等待可以理解为“提前找元素”,就是说,页面一弹开,它就开始找,如果提前找到了,连计时都不用。如果提前找不到,也就是说当页面加载完成了,还没找到,那它就要就开始计时了,默认每0.5秒找一下,10秒内它要是找到了,就停止计时,开始下一步操作,假设10秒内确实找不到,则抛出TimeOut异常。
注意:当查找某个元素时,同时使用了显式和隐式,那么优先权应当交给显式查找,也就是说,一弹开页面就开始找;另外,计时的时间应当取连两者中最大的那个值;
(4)浅谈二者比较:隐式等待对于每一个要查找的元素都设置了同样的查找规则,一般来说,我们只需要在driver.get(url)之前写一次driver.implicitly_wait( )即可 ,整个程序的查找都有效,哪怕你跳转了页面(记得切换窗口句柄先),也时同样有效的。缺点就是,可能你要的元素都已经出现了,尽管这个时候还没有完成页面加载,但是程序还在傻傻地等待页面全部加载完成,再帮你计时并且寻找元素;而显式等待就智能多了,页面一出现就开始疯狂找,不浪费你时间。(5)强制等待我就不说了。。。。。。