如果访问网页的时候或者说使用click点击按钮以后
因为网速等各种原因,新的页面可能无法立即出现。可能需要等待一两秒
但是程序的执行是很快的
它不会去等待这1秒2秒
那么如果新页面没有加载完成,又执行了find_element程序就会报错。提示找不到元素
通常我们就需要使用一些办法,让程序延迟执行find_element指令
time
导入time模块
import time
在需要延迟的地方加上
time.sleep(1)
这表示暂停(延迟)程序执行1秒钟
但是这会有一个问题,到底暂停多少秒合适呢?有可能网页2秒 5秒才加载完毕呢
隐式等待(全局等待)
隐式等待(Implicit Waits)是一种全局等待机制,在使用Selenium时可以设置一个固定的等待时间,让WebDriver在查找元素时等待一段时间,如果在指定时间内找到了元素,则立即执行下一步操作;如果超过了指定时间仍未找到元素,则抛出异常。
使用隐式等待可以为整个WebDriver的生命周期设置一个统一的等待时间,这样在查找元素时就不需要显式地每次都设置等待时间。
导入
from selenium import webdriver
可以在代码的最前面设置等待时间,这表示最长等待10秒,如果超出10秒还没找到这个元素就抛出异常
# 设置隐式等待时间为10秒
driver.implicitly_wait(10)
其他代码就不需要额外修改。需要注意的是,隐式等待是全局设置,适用于整个WebDriver的生命周期,所以一旦设置了隐式等待时间,后续的所有查找元素操作都会遵循这个等待时间。
但是在实际使用中,我发现会出现一些问题,目前尚不清楚原因。所以不太推荐这种方法
显式等待
使用显式等待可以等待指定条件成立后再继续执行后续操作,它会在一直不断尝试判断条件是否满足,如果条件满足,则立即执行后续操作;
在使用 wait.until()
方法时,它会持续等待,直到传入的条件返回 True 或达到了超时时间。等待的时间取决于页面的加载速度和条件的满足情况。如果条件在等待时间内满足,那么它会立即返回找到的元素。如果超过等待时间,而条件仍未满足,那么将抛出 TimeoutException
异常。
导入
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
设置显式等待时间10秒
wait = WebDriverWait(wd, 10)
显式等待-选择查找单个元素
element = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'input_text')))
显式等待-选择查找多个元素
elements = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'input_text')))