如果访问网页的时候或者说使用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')))
最后修改:2023 年 07 月 04 日
如果觉得我的文章对你有用,请随意赞赏