前言:为什么需要时间等待?
答:因为计算机软、硬件、网络环境制约,导致代码运行速度快于网页加载速度。代码做元素定位速度快于网页内容加载速度,导致代码元素定位不成功。以及JS,ajax等技术应用与网页导致网页数据刷新时不一定定位到。需要selenium在元素定位时等待元素出现。
selenium提供了三种等待时间方法,分别是强制等待,隐式等待,显式等待。
案例:使用find_element_by_link_text()定位必应网站上“图片”元素,由于文本元素加载慢,需要等待。
强制等待利用time模块提供的sleep()函数实现。
from selenium import webdriver
from time import sleep,ctime
driver = webdriver.Chrome()
driver.get("https://cn.bing.com/")
print(ctime())
# 强制等待
sleep(2)
driver.find_element(By.XPATH, '//*[@id="images"]/a').click()
sleep(3)
driver.quit()
强制等待相当于,A同学约B同学在食堂见面然后去图书馆,A同学只在食堂等10分钟,假如B同学第三分钟到,但是他们也要第十分钟才从食堂去图书馆。
隐式等待使用driver.implicitly_wait(time)方法实现。
代码如下:
from selenium import webdriver
from time import sleep,ctime
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://cn.bing.com/")
print(ctime())
# sleep(2)
driver.find_element_by_xpath('//*[@id="images"]/a').click()
print(ctime())
sleep(3)
driver.quit()
隐式等待相当于,A同学约B同学在食堂见面然后去图书馆,A同学只在食堂等10分钟,假如B同学第三分钟到,那么他们第三分钟就从食堂去图书馆。
显示等待的实现通过,引入WebDriverWait类实现。代码如下:
from selenium import webdriver
from time import sleep,ctime
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://cn.bing.com/")
element = WebDriverWait(driver, 5, 0.5).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="images"]/a')))
element.click()
sleep(3)
driver.quit()
显示等待相当于,A同学约B同学在食堂见面然后去图书馆,A同学只等10分钟,过一段时间到食堂门口观察B同学是否到,假如B同学第三分钟到,那么他们第三分钟就从食堂去图书馆。
1.都会设置最长等待时间
2.在等待到要等待元素,立即执行后续代码。
较强制等待智能。
1.作用域不一样,隐式等待一次设置全局使用,显式等待只用于某个元素定位时等待。
2.报错不一样,显式等待超时时报错为超时异常,隐式等待超时时报错按原错误报错。
3.实现机制不一样,隐式等待是要先加载元素定位网页的全部内容保证对本页面元素定位成功。显式等待是过一段时间观察网页中被定位元素是否加载,若加载则可定位成功。
在定位直播,视频网站这类网站时,由于网页内容丰富,加载整个网页时间长,使用隐式等待会差于显式等待。