用上了奇技淫巧的这种字眼,本应该以一种狂拽酷炫吊炸天的开场才能名副其实,然而想到其实我们是一篇务实的技术总结性文章,那么我们就不再以一种博人眼球的开场来提升逼格了。本文主要通过总结多年使用WebDriver的经验和心得来跟大家一起交流学习。那么我们就不再闲扯题外话,言归正传,娓娓道来了。
关于Wait
在WebDriver时代,Wait不得不说是其精华功能的存在。在官方文档中我们可以看到等待分为显性等待(Explicit Waits)和隐性等待(Implicit Waits)。但是使用场景其实差异很大,正因为官方文档把这两个放在一起描述,导致我们大部分人对两者的差异感知不深,同时对Explicit Waits不太感冒,然而他却有四两拨千斤之巧劲。
既然把他们捧得如此之高了,那么我们来详细说一下这两等待的使用方法和场景。
Implicit Waits
这个隐式等待,之所以叫做隐式,是因为他在这里定义后,会影响后续所有的findElement(By)和findElements(By)操作。在后续进行findElement(By)和findElements(By)方法时,WebDriver会每隔500ms根据元素定位器(By)进行查找元素,如果查到,则返回元素;如果没有查到,休息500ms再进行查找,如果超过10s,则报元素不存在的异常,终止后续操作。
那么我们可以明确知道,Implicit Waits的作用于是在查找元素。当然到了这里,我们大部分人可能主观的认为,ImplicitWait在手,世界我有,基本上不用考虑Explicit Waits了哈。
Explicit Waits
当然Selenium的设计人员肯定不会做无用功的,我们再来分析一下显式等待。从上面的写法我们可以看到他的作用是:检查定位器(By)的元素状态是可以被点击状态时,结束等待,否则每个500ms检查一次,当到达10s仍然处于不可点击状态,则抛出异常,结束后续操作。
这么解读,其实大家应该了解了,这个等待是为了等待页面到达某种条件,当条件满足后,再做后续的其他一系列事情。如上图代码中,当这个元素可以点击了,那么我们接下去对他进行点击操作。
那我们日常使用中,会不会出现这种情况多不多呢?我们先来说一个比较直接例子1:
我们在有些网站的注册上会看到如上图所示的登录注册,请求验证码在倒计数时,是不能点击验证码发送按钮的,所以这个等待也就是等这个元素能被点击的时候,我们再一次点击它,否则就会出现。
看到这里我们是不是让我们想到了一个词AJAX,在以前的静态网页时代,一个Implicit Waits我们就可以打遍天下无敌手,但是随着互联网技术的发展,用户体验的提升,AJAX技术随处可见,正因为这些,我们会看到页面越来越炫丽,同时交互流程也越来越严禁。这时候,我们不得不靠Explicit Waits来帮助我们解决AJAX动态页面上自动化操作。既然给予了如此厚望,Explicit Waits也负厚望,基本实现了绝大部分动态页面的响应监控。这里列举了一下ExpectedConditions的一些常用方法:
总结
看到这里,其实我们应该了解显式和隐式等待作用其实是基本没有任何重合的,有的只是相互依赖关系,只有找到了这个元素(使用Implicit Waits),才能基于这个元素进行各种条件等待(Explicit Waits)。当然我们在实际使用过程中,也只有更好的使用两种等待,才能使我们的用例更加健壮稳定,同时提升我们的效率(PS:目前大部分应对加载慢的问题,都是强制增加等待时间,其实是不够优雅的)。