有时我们在某个时段调试好了某段代码,但在另一时段运行时却会出错,如图:
很大的可能,是程序在运行时,因某种原因(网络速度变慢,或系统运行速度变慢等),在需要元素定位(或点击按钮等)的时候,该元素(或按钮)却尚未加载到页面,此时运行脚本会因无法定位(或无法点击按钮)而导致程序无法执行。简单来说就是代码执行的速度,快于页面元素加载的速度。要解决这个问题,我们需要控制程序运行的节奏,让某段定位代码暂停一段时间,等待所需页面元素全部加载完成之后,再做定位动作。
这个“让某段定位代码暂停一段时间”,就是Selenium中的等待问题。
十九、Selenium中常用的元素等待方式
Selenium中常用的元素等待方式有三种:
强制等待:time.sleep()
隐式等待:implicitly_wait()
显式等待:WebDriverWait()
现分述如下:
1、time.sleep(3)(强制/固定等待3秒)
(1)定义:强制等待是一种最简单的方法,就是强制等待(N秒),需要导入“time”模块。
(2)优点:脚本调试过程时,还是可以用的,方便快捷。
(3)缺点:不智能,如果设置的时间太短,元素还没有加载出来一样会报错。设置的时间太长,则会浪费时间。因而在实际开发中,这个方式一般比较少用。
2、implicitly_wait()(隐式等待)
(1)隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。
(2)优点:通过添加 implicitly_wait() 方法就可以方便的实现智能等待;implicitly_wait(10) 的用法肯定比 time.sleep(10) 更智能。
(3)缺点:程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步。但有时候页面想要的元素早已加载完成了,但是因为个别js之类的东西特别慢,程序仍得等到页面全部完成才能执行下一步。
(4)需要注意的是:隐式等待相当于设置全局等待,设置以后这个隐式等待会在WebDriver对象实例的整个生命周期起作用,不需要像强制等待一样写很多条代码。
3、WebDriverWait(显式等待)
(1)它主要的特点是程序每隔xx秒就会尝试一下,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
WebDriverWait有四个参数,分别是driver驱动, timeout超时时间,poll_frequency = POLL_FREQUENCY轮训时间,也就是去判断是否满足条件的时间间隔,默认是0.5秒, ignored_exceptions=None在等待的过程中需要忽略的异常,是一个可迭代的异常类集合,比如我们可以设置一个list,里面是[NoSuchElementException,NoSuchAttributeException,InvalidElementStateException....],默认情况下,是一个元组,只包含一个NoSuchElementException,因为只有元素出现,才能去判断条件是否满足,在不断轮训的过程中,肯定会发生NoSuchElementException,这个时候必须忽略掉这个异常,不然程序就会中断。
其中driver和timeout是必传的位置参数,另外两个是选择传递的关键字参数,如果不传都有指定的默认值。
WebDriverWait参数 参数说明
timeout 超时时间,等待的最长时间(同时要考虑隐性等待时间)
driver 传入WebDriver实例
poll_frequency 调用until或until_not中的方法的间隔时间,默认是0.5秒
ignored_exceptions 忽略的异常,如果在调用until或until_not的过程中抛出这个元组中的异常,则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException。
如果超出了设置的时长,元素还没有被加载,则抛NoSuchElementException异常(可自己指定异常或自定义异常)。
(2)WebDriverWait配合该类的until()和until_not()方法,就能够根据判断条件进行灵活的等待。
until方法
method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False;
message: 如果超时,抛出TimeoutException,将message传入异常。
until_not方法
与until相反,until是当某元素出现或什么条件成立则继续执行;
until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。
其中等待判断还有一些方法:
- presence_ of_ element_ located:元素存在
- vibility of element_ located: 元素可见
- element to be_ clickable: 元素可点击
版权归原作者 老菜鸟YDZ 所有, 如有侵权,请联系我们删除。