第六节、显示等待和隐式等待以及强制等待

  • 先说说为啥需要等待呢,因为通常selenium在采集的时候,就像我们访问页面一样,需要等待页面加载完成再进行操作,这个过程在selenium中是默认的,但是有些时候页面加载会遇到一些问题(比如内部某些js还没有加载完成),导致找不到元素、找到元素无法执行操作、找不到数据等,页面需要等待一段时间才能进行操作,同时也为了缓解访问服务器的压力,降低一些访问频率,故而需要等。

一、强制等待

强制等待就是time模块中的sleep方法,属于线程等待,和浏览器元素是否加载完成无关,例如sleep(3),就是啥呀不管,就等上3秒,继续执行下一步,最不推荐使用的一种,不堪大用

二、隐式等待

需要等待整个页面加载完成才能执行下一行代码,即先等待页面加载完成,才开始执行查元素的代码。优点就是,执行一次,代码行的角度,在使用之后对改行代码后所有找元素有效,找不到元素后就以轮询的方式等待10s,直到超出定时还找不到就抛错。同时也有个缺点,需要等待整个页面加载完成,不需要的元素也会等,消耗时间比较多。
driver.implicitly_wait(10) # 单位s

三、显示等待

又称条件等待,必须指定需要等待的元素,它可以在元素一加载出来就执行下一步,且只对指定元素有效。等待方式是,driver等待某个条件成立时,继续执行,如果条件不成立就每隔一段时间(默认0.5秒)检查一次,直到超时仍未成立,便抛出TimeoutException超时异常。一般配合该类的until()和until_not()方法,并将该等待封装到工具类中使用,就能够根据判断条件进行灵活地等待。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 该种返回值直接为找到的具体的一个元素时,必须是唯一元素定位,不能是一组
# 主要有4个参数:
# driver:浏览器驱动
# timeout:等待时间
# poll_frequency:检测的间隔时间,默认0.5s
# ignored_exceptions:超时后的异常信息,默认抛出NoSuchElementException

ele = WebDriverWait(driver, 10, 0.5).until(
    EC.visibility_of_element_located((By.NAME, "p"))
)
posted @ 2021-08-30 17:46  挑灯  阅读(206)  评论(0)    收藏  举报