Selenium自动化测试中的等待处理
Selenium是一个自动化测试工具,可用于测试Web应用程序的用户界面。Selenium WebDriver是其中的一个模块,可以驱动浏览器执行操作。Selenium WebDriver Wait是一个等待类,可以在某些条件变为true之前,持续等待页面的元素。
一、选取元素等待
在自动化测试中,有时需要在页面上找到某个元素,但如果页面的加载速度较慢,或者网络不佳,可能会导致查找元素失败。这时可以使用Selenium WebDriver Wait来等待元素出现。
使用Selenium WebDriver Wait,需要引入ExpectedConditions类,该类提供了许多预定义的等待条件,例如visibility_of_element_located
,presence_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错误。