有些網站打開地址或者進行操作后,頁面需要加載幾秒鍾,或者等待某一元素加載完成后再繼續下一步操作,這里就需要進行設置等待時間
導入time模塊,time模塊是python自帶的,無需下載
一、設置等待時間有三種方法:
1、強制等待
time.sleep(time) # 強制等待3秒后,進行下一步操作,也可以是小數,單位為秒
缺點:不能准確把握需要等待的時間(有時候操作未完成,等待就結束了,導致報錯;有時候操作已經完成了,但時間還沒到,浪費時間),如果再用例中大量使用,會浪費不必要的等待時間,影響用例的執行效率。
優點:使用簡單,可以在調試時使用。
2、隱式等待
driver.implicitly_wait(X),在X時間內,頁面加載完成,進行下一步操作。
缺點:使用隱式等待,程序會一直等待頁面加載完成,才會執行下一步操作
(有時候頁面想要的元素早已加載完成了,但是頁面上個別元素還沒有加載完成,仍要等待頁面全部完成才能執行下一步,使用 也不是很靈活)
優點:隱式等待對整個driver的周期都起作用,所以只要設置一次即可
3、顯示等待
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver, 超時時間, 調用頻率, 要忽略的異常).until(要執行的方法, 超時時返回的錯誤信息)
優點:使用相對比較復雜
缺點:等地啊判斷准確,不會浪費多余的等待時間,在用例中使用,可以提高執行效率
示例:打開登錄頁面,以登錄按鈕為頁面加載成功的標志,如果20秒內,定位到登錄按鈕,就進行登錄操作,不再繼續等待,如果20秒內還沒定位到登錄按鈕,下一步操作就會報錯,並拋出異常。
from selenium import webdriver
import time
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expect_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://www.baidu.com/)
# 加載等等,等待加載頁面,根據目標頁面特征元素進行判斷
locatorLogin = (By.TAG_NAME,"button")
try:
WebDriverWait(driver,20,0.5).until(EC.presence_of_element_located(locatorLogin))
print("登錄頁面加載出來啦")
except:
print("頁面加載失敗")
# 頁面加載完成后,進行用例的相應操作
ownerSite = driver.find_element_by_id("ownerSite")
ownerSite.clear()
ownerSite.click()
ownerSite.send_keys(u"今天星期幾")
......
......
二、WebDriverWait類
1、until()
until()方法:直到條件成立返回為真,等待結束。如果超時,拋出TimeoutException,將message傳入異常。
2、until_not()
until_not()方法:直到條件不成立返回為真,是當某元素消失或什么條件不成立則繼續執行,等待結束。如果超時,拋出TimeoutException,將message傳入異常。
3、excepted_conditions異常處理模塊
expected_conditions是selenium的一個模塊,其中包含一系列可用於判斷的條件方法。
三、WebDriverWait自帶的方法
is_displayed():判斷元素是否被展示出來
is_enable():判斷元素是否可操作
is_select():判斷元素是否被選擇