1、为什么需要设置等待时间:

因为网页打开后需要加载对应的资源文件,页面渲染,窗口处理等等,我们需要等网页打开稳定后才能准确的进行后面的定位等操作

2、等待的分类

(1)强制等待

from time import sleep 

sleep(3)  #强制等待5秒后才进行下一步操作;缺点是不管资源是否加载完成,都一直等5秒,会造成浪费;常用于自己调试代码看效果

(2)隐性等待:设置一个最长等待时间,如果规定时间内页面加载完成则立即执行下一步操作,否则一直等到时间截止,然后才执行下一步

缺点:程序会一直等待这个页面加载完成,到浏览器标签兰那个加载圈不在转圈为止

driver.implicitl_wait(10)  #隐性等待,最长10秒

注意:对driver起作用,所以只用设置一次就可以了,不用每次都设置

(3)显性等待

a:需要WebDriverWait配合使用

b:until和until_not,程序每隔N秒检查一次,如果成功,则执行下一步,否则继续等待,直到超过设置的最长等待时间

c:语法

from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

例子:
from selenium import webdriver
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.Firefox()
url = "https://baidu.com"
driver.get(url)

#隐性等待
driver.implicitly_wait(10) # 隐性等待,最长等10秒

#x显性等待
try:
ele = WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,"kw")))
ele.send_keys("杭州天气")
print("资源加载成功")
print(driver.title)
except:
print("资源加载失败")
finally:
print("资源清理")
#退出浏览器
driver.quit()

注:

(1)EC.presence_of_element_located()是确认元素是否已经出现了
(2)显性等待和隐性等待可以同时使用,等待的最长时间取两者之中的较大者