目录
1. 强制等待
- 方法:sleep(seconds),seconds 等待时间,单位 秒 s
- 说明:不管浏览器是否加载完了,程序都得等待3秒,不建议使用,严重影响执行速度
# -*- coding: utf-8 -*-
# @Time : 2021/1/17
# @Author : 大海
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('https://blog.youkuaiyun.com/IT_heima?spm=1001.2014.3001.5343')
sleep(2) # 强制等待2秒再执行下一步
print(driver.current_url)
print(driver.title)
driver.close()
2. 隐式等待
- 方法:implicitly_wait(time_to_wait) , time_to_wait 等待时间, 单位 秒 s
- 说明:设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。此方法是全局性的,设置一次即可
- 弊端:程序会一直等待整个页面加载完成,也就是一般情况下看到浏览器标签栏那个小圈不再转,才会执行下一步,但是页面的元素已加载完,js等未加载完,仍会等待
# -*- coding: utf-8 -*-
# @Time : 2021/1/17
# @Author : 大海
from selenium import webdriver
driver = webdriver.Chrome()
# 隐式等待,最长等20秒
driver.implicitly_wait(20)
driver.get('https://blog.youkuaiyun.com/IT_heima?spm=1001.2014.3001.5343')
print(driver.current_url)
print(driver.title)
driver.close()
3. 显式等待
init方法:__init__(driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)
- driver :浏览器驱动。
- timeout :最长超时时间,默认以秒为单位。
- poll_frequency :检测的间隔(步长)时间,默认为0.5S。
- ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。
unit方法:until( method, message='')
- method:传入执行的方法
- message:超时时的提示信息
until_not方法:同until
- 使用: WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)
# -*- coding: utf-8 -*-
# @Time : 2021/1/17
# @Author : 大海
from selenium import webdriver
from selenium.common.exceptions import ElementNotVisibleException
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Chrome()
# 隐式等待,最长等20秒
driver.implicitly_wait(20)
driver.get('http://baidu.com')
print(driver.current_url)
print(driver.title)
# 每隔0.5s去查找元素 kw,超时时间为10s,返回WebElement对象
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("kw"))
element.send_keys('selenium')
# 每隔1去查找元素 kw是否可见,超时时间为30s,返回结果为布尔值
is_disappeared = WebDriverWait(driver, 30, 1, ElementNotVisibleException).until_not(
lambda x: x.find_element_by_id("kw1").is_displayed())
print(is_disappeared)
# 错误用法 until() 第一个参数应该是方法,此处传入的是WebElement对象,所以不正确,可参照上面的写法
# WebDriverWait(driver, 10).until(driver.find_element_by_id('kw'))
driver.close()
4. 总结
- sleep():强制等待n秒,影响程序执行速度
- implicitly_wait():隐式等待,全局性,设置一次即可,针对的是整个页面是否加载完成
- WebDriverWait():显示等待,针对单个元素判断,灵活
- 隐式等待和显时等待同时使用时,超时时间取两者最长的