一、强制等待 .sleep()
使用 time.sleep()
强制等待,设置固定的休眠时间,对于代码的运行效率会有影响。
from time import sleep
sleep(3)
二、隐式等待 implicitly_wait()
implicitly_wait()
: 隐式等待作用于全局,确保每一个你查找的元素都能够有足够的load时长,以便找到它使脚本正常运行。
from time import sleep, time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://demo.zentao.net/user-login-L215Lmh0bWw=.html")
driver.maximize_window()
start = time()
driver.implicitly_wait(5)
try:
driver.find_element(By.ID, 'kw')
except Exception as e:
print(e)
print(f'耗时:{time() - start}')
finally:
driver.quit()
三、显式等待 until
设置一个超时时间,每个一段时间就去检测一次该元素是否存在,如果存在则执行后续内容,如果超过最大时间(超时时间)则抛出超时异常(TimeoutException)。显示等待需要使用 WebDriverWait
,同时配合 until
或 not until
。
WebDriverWait(driver, 5, poll_frequency = 1)
:等待5s,间隔时间为1s(默认为0.5)
until(method,message='')
方法是当某条件成立则继续执行。until_not 方法与之相反,它是当某条件不成立则继续执行,参数与 until 方法相同
method
: 在等待期间,每隔poll_frequency调用这个方法,直到返回值不是 False
message
:如果超时,抛出TimeoutException,将 message 传入异常
示例:
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.Chrome()
driver.get("https://demo.zentao.net/user-login-L215Lmh0bWw=.html")
driver.maximize_window()
try:
ele1 = WebDriverWait(driver, 5, 1).until(EC.presence_of_element_located((By.ID, "account")), message="超时啦1")
print(ele1)
ele2 = WebDriverWait(driver, 5, 1).until_not(EC.presence_of_element_located((By.ID, "account")), message="超时啦2")
print(ele2)
except Exception as e:
print(e)
finally:
driver.quit()