1. 强制等待
- 方法:sleep(seconds),seconds 等待时间,单位 秒 s
- 说明:不管浏览器是否加载完了,程序都得等待3秒,不建议使用,严重影响执行速度
1. # -*- coding: utf-8 -*- 2. # @Time : 2021/1/17 3. # @Author : 大海 4. 5. from selenium import webdriver 6. from time import sleep 7. 8. driver = webdriver.Chrome() 9. driver.get('https://blog.csdn.net/IT_heima?spm=1001.2014.3001.5343') 10. 11. sleep(2) # 强制等待2秒再执行下一步 12. print(driver.current_url) 13. print(driver.title) 14. 15. driver.close()
2. 隐式等待
- 方法:implicitly_wait(time_to_wait) , time_to_wait 等待时间, 单位 秒 s
- 说明:设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。此方法是全局性的,设置一次即可
- 弊端:程序会一直等待整个页面加载完成,也就是一般情况下看到浏览器标签栏那个小圈不再转,才会执行下一步,但是页面的元素已加载完,js等未加载完,仍会等待
1. # -*- coding: utf-8 -*- 2. # @Time : 2021/1/17 3. # @Author : 大海 4. 5. from selenium import webdriver 6. 7. driver = webdriver.Chrome() 8. # 隐式等待,最长等20秒 9. driver.implicitly_wait(20) 10. driver.get('https://blog.csdn.net/IT_heima?spm=1001.2014.3001.5343') 11. 12. print(driver.current_url) 13. print(driver.title) 14. 15. 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(可执行方法, 超时时返回的信息)
1. # -*- coding: utf-8 -*- 2. # @Time : 2021/1/17 3. # @Author : 大海 4. 5. from selenium import webdriver 6. from selenium.common.exceptions import ElementNotVisibleException 7. from selenium.webdriver.support.ui import WebDriverWait 8. 9. driver = webdriver.Chrome() 10. # 隐式等待,最长等20秒 11. driver.implicitly_wait(20) 12. driver.get('http://baidu.com') 13. 14. print(driver.current_url) 15. print(driver.title) 16. 17. # 每隔0.5s去查找元素 kw,超时时间为10s,返回WebElement对象 18. element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("kw")) 19. element.send_keys('selenium') 20. 21. # 每隔1去查找元素 kw是否可见,超时时间为30s,返回结果为布尔值 22. is_disappeared = WebDriverWait(driver, 30, 1, ElementNotVisibleException).until_not( 23. lambda x: x.find_element_by_id("kw1").is_displayed()) 24. print(is_disappeared) 25. 26. # 错误用法 until() 第一个参数应该是方法,此处传入的是WebElement对象,所以不正确,可参照上面的写法 27. # WebDriverWait(driver, 10).until(driver.find_element_by_id('kw')) 28. driver.close()
4. 总结
- sleep():强制等待n秒,影响程序执行速度
- implicitly_wait():隐式等待,全局性,设置一次即可,针对的是整个页面是否加载完成
- WebDriverWait():显示等待,针对单个元素判断,灵活
- 隐式等待和显时等待同时使用时,超时时间取两者最长的