- 强制等待:time.sleep()
- 显式等待:WebDriverWait() func
- 隐式等待:implicitly_wait()
1. 强制等待
利用 time 模块的 sleep() 方法:time.sleep(3)
# 等待3秒
这种叫强制等待,不管你浏览器是否加载完成,都得给我等待3秒,3秒一到,继续执行下面的代码,不建议用这种等待方法,严重影响代码的执行速度。
2. 隐式等待
方法:driver.implicitly_wait(3)
# 隐式等待3秒
设置一个等待时间
- 在等待时间内,页面加载完成,则执行下一步;否则一直等待时间结束,然后执行下一步
- 缺点:程序会一直等待整个页面加载完成,直到超时,需要的元素加载完成,个别元素加载慢,仍要等待整个页面加载完成才能执行下一步
3. 显式等待
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
4个参数:
- driver:浏览器驱动对象
- timeout:等待时间
- poll_frequency:检测的间隔时间,默认0.5s
- ignored_exception:超时后的异常信息,默认抛出 NoSuchElementException
为了避免隐式等待的缺点,需要用到显式等待
配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx检查一次,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
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://www.baidu.com/")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//*[@id="su"]'))
)
text = driver.page_source
print("text", text)
finally:
driver.quit()