SeleniumWebDriverWait详解

发布时间:2023-05-21

Selenium自动化测试中的等待处理

Selenium是一个自动化测试工具,可用于测试Web应用程序的用户界面。Selenium WebDriver是其中的一个模块,可以驱动浏览器执行操作。Selenium WebDriver Wait是一个等待类,可以在某些条件变为true之前,持续等待页面的元素。

一、选取元素等待

在自动化测试中,有时需要在页面上找到某个元素,但如果页面的加载速度较慢,或者网络不佳,可能会导致查找元素失败。这时可以使用Selenium WebDriver Wait来等待元素出现。 使用Selenium WebDriver Wait,需要引入ExpectedConditions类,该类提供了许多预定义的等待条件,例如visibility_of_element_locatedpresence_of_element_located等。下面是一个例子:

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.Firefox()
driver.get("http://www.example.com")
wait = WebDriverWait(driver, 10)
try:
    element = wait.until(EC.visibility_of_element_located((By.ID, 'myElement')))
    print("Element found!")
finally:
    driver.quit()

在这个例子中,等待10秒直到ID为myElement的元素可见。如果元素在10秒内未出现,则返回TimeoutException错误。如果元素可见,将打印"Element found!"。

二、多次等待

有时需要等待多个元素,或者需要多次等待同一个元素。在这种情况下,可以将等待逻辑放入一个循环中,直到元素出现为止。下面是一个例子:

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.Firefox()
driver.get("http://www.example.com")
wait = WebDriverWait(driver, 10)
for i in range(3):
    try:
        element = wait.until(EC.visibility_of_element_located((By.ID, 'myElement')))
        print("Element found!")
        break
    except:
        print("Element not found, waiting and trying again...")
finally:
    driver.quit()

在这个例子中,循环3次,每次等待10秒直到ID为myElement的元素可见。如果元素在10秒内未出现,则等待下一个10秒。如果元素可见,将打印"Element found!",退出循环。

三、等待页面加载

有时需要等待页面的完全加载,例如在点击一个链接之后等待页面跳转完毕。可以使用Selenium WebDriver Wait来等待页面的url变化,以确保页面已经加载完毕。

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.Firefox()
driver.get("http://www.example.com")
wait = WebDriverWait(driver, 10)
try:
    wait.until(EC.url_changes)
    print("Page loaded!")
finally:
    driver.quit()

在这个例子中,等待10秒直到页面的url变化。如果url变化,则页面已经加载完毕,将打印"Page loaded!"。如果url未在10秒内变化,则返回TimeoutException错误。

四、等待alert弹框

有时需要等待alert弹框出现,例如在点击一个按钮之后等待弹框弹出。可以使用Selenium WebDriver Wait来等待alert弹框出现。

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.Firefox()
driver.get("http://www.example.com")
wait = WebDriverWait(driver, 10)
try:
    alert = wait.until(EC.alert_is_present())
    print(alert.text)
    alert.accept()
finally:
    driver.quit()

在这个例子中,等待10秒直到alert弹框出现。如果alert弹框出现,将打印弹框内容,并点击确认按钮。如果alert弹框未在10秒内出现,则返回TimeoutException错误。