1. 程式人生 > 其它 >selenium框架等待時間(強制等待、隱式等待、顯示等待)

selenium框架等待時間(強制等待、隱式等待、顯示等待)

1、強制等待(sleep)
from time import sleep
sleep(3)#強制等待3秒

缺點∶由於Web載入的速度取決於測試的硬體、網速、伺服器的響應時間等因素。如果等待時間太長,容易造成時間浪費,如果等待時間太短有可能會造成在web端還
沒有載入完所需要定位的element,而出現報錯,由於等待時間無法確定,使用太多的sleep會影響執行速度,大大地降低效率,所以建議測試中儘量少使用強制等待
2、隱式等待(implicitly_wait)
#隱式等待10s
driver.implicitly _wait(10)

簡介:隱式等待是全域性的是針對所有元素,設定等待時間如10秒,如果10秒內出現,則繼續向下,否則拋異常。可以理解為在10秒以內,不停重新整理看元素是否加載出來。
使用場景:隱式等待只需要宣告一次,一般在開啟瀏覽器後進行宣告。宣告之後對整個drvier的生命週期都有效,後面不用重複宣告。隱式等待存在一個問題,那就是程
序會一直等待整個頁面載入完成,也就是一般情況下你看到瀏覽器標籤欄那個小圈不再轉才會執行下一步,但有時候頁面想要的元素早就在載入完成了,但是因為個別js
之類的東西特別慢,仍得等到頁面全部完成才能執行下一步。

3、顯示等待(expected_conditions)

簡介:顯示等待是單獨針對某個元素,設定一個等待時間如5秒,每隔0.5秒檢查一次是否出現,如果在5秒之前任何時候出現,則繼續向下,一般需要配合該類的untl()
和until_not)方法一起用,直到超過設定的最長時間,然後丟擲超時錯誤TimeoutExceptior以下介紹幾個最常用的方法:

1.判斷element是否可見: visibility_of_element_located(locator)(可見代表element非隱藏,並且element寬和高都不等於0)
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By #示例 target = EC.visibility_of_element_located(By.ID,'user') #配合until()使用(等待元素可見) #5表示最長超時時間,預設以秒為單位;1表示檢測的間隔步長,在等待期間,每隔一定時間(預設0.5秒),呼叫untl或until_not裡的方法,直到它返回True
或Fase.WebDriverWait(driver,5,1).until(EC.visibility_of_element_located(By.ID,'user'))
#配合until_not()使用(等待元素不可見) WebDriverWait(driver,5,1).until_not(EC.visibility_of_element_located(By.ID, 'user')) #在類中封裝為一個函式 def wait_eleLocated(self, loc, timeout=30, poll_frequency=0.5, model=None):e.m :param loc:元素定位表達;元組型別,表達方式(元素定位型別,元素定位方法),示例:(By.lD, "kw "):param timeout:超時時間 :param poll_frequency:輪詢頻率 :param model:等待失敗時,截圖操作,圖片檔案中需要表達的功能標註:return:None "1 self.logger.info(f等待"{model}"元素,定位方式:{loc}) try: start = datetime.now() WebDriverWait(self.driver, timeout, poll_frequency).until(EC.visibility_of_element_located(loc))end = datetime.now() self.logger.info(f等待"{model"時長:{end - start}')except TimeoutException: self.logger.exception(f等待"{model}"元素失敗,定位方式:{loc}')#截圖 self.save_weblmgs(f”等待元素[{modell}]出現異常")raise
⒉.判斷某個element是否被載入到dom樹: presence_of_element_located(locator)(並不代表該element一定可見)
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
target = EC.presence_of_element_located(By.ID, 'user')
3.判斷某個element中是否可見並且可點選: element_to_be_clickable(locator)
from selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import By
target = EC.element_to_be_clickable(By.ID,'user')
4.判斷某個element是否被選中: element_to_be_selected(element)(一般用在下拉列表)
from selenium.webdriver.support import expected_conditions as Ec
from selenium.webdriver.common.by import By
element = driver.find_element_by_class_name('selector')EC.element_to_be_selected(element)