Python Selenium 三种等待方式解读
在使用 Selenium 进行自动化测试时,经常会出现元素还未被加载出来就去操作的情况,导致程序报错或者测试失败。为了避免这种情况,我们需要进行等待操作。Selenium 提供了三种等待方式:隐式等待、显式等待和无条件等待。在本文中,我们将详细讲解这三种等待方式的使用方法及其区别。
一、隐式等待
driver.implicitly_wait(10)
隐式等待是全局性(全局等待时间设置一次就会生效),也是全局性的等待,意味着它会在整体代码执行的过程中对所有元素进行等待。就是每个操作自带超时等待时间,如果在超时时间内元素出现时,就会执行操作,如果超过了超时时间没有出现元素,就会抛出 NoSuchElementException
异常。
默认情况下,Selenium 不会等待页面加载完成,就开始执行后面的代码。但有些时候页面上的元素并非直接出现在页面 HTML 源代码中,而是通过 AJAX/JavaScript 异步加载的,此时我们需要使用隐式等待来等待元素的加载。
隐式等待的超时时间可以自己设置,单位为秒。例如,我们将等待时间设置为10秒,当在这个时间范围内元素出现时,我们就进行后续的操作。
二、显式等待
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
显式等待是针对于某个元素的,等待条件可以自定义,我们需要设置等待的元素,以及一个最长等待时间。在等待时间内,如果条件满足,则会进行后续操作;如果时间到了还未满足条件,则会抛出 TimeoutException
异常。
显式等待比较灵活,因为它可以等待某个特定的条件成立时才执行后续的操作,所以显式等待一般在比较复杂的场景下使用。等待条件可以是等待元素可见、等待元素被选中、等待元素被加载等。上面的示例中,我们将等待条件设置为元素出现在网页中。
三、无条件等待
import time
time.sleep(10)
无条件等待就是用 time.sleep()
来让程序等待指定的时间。等待时间到了之后,无论元素是否存在,代码都将继续执行。这种方式一般用于程序异常等好不到合适的等待条件的时候。
示例
下面是一个例子,展示了如何使用三种等待方式来等待一个元素的加载。
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("http://www.example.com")
# 隐式等待
driver.implicitly_wait(10)
# 显式等待
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
# 无条件等待
time.sleep(10)
driver.quit()
在这个例子中,我们首先使用了隐式等待来等待网页加载完成。接着使用显式等待来等待 myDynamicElement
元素的加载,如果超过了10秒仍未出现,则会抛出 TimeoutException
异常。最后,使用无条件等待来等待10秒钟,无论元素是否在10秒钟内出现,程序都会等待完毕。
注意:在实际使用中,应该根据场景需求选择合适的等待方式。如果当前程序中只有一个元素需要等待,那么显式等待时最好的选择。如果需要等待整个页面的加载完成,则可以使用隐式等待。如果程序异常或逻辑问题等待不到合适的等待条件时,则可以使用无条件等待。