軟件測(cè)試 | 隱式等待、顯示等待和強(qiáng)制等待
等待機(jī)制簡(jiǎn)介
系統(tǒng)在實(shí)際工作中引入等待機(jī)制可以保證代碼運(yùn)行的穩(wěn)定性,保證代碼運(yùn)行不受網(wǎng)速、計(jì)算機(jī)性能等條件的約束。
等待就是當(dāng)系統(tǒng)運(yùn)行時(shí),如果頁(yè)面的渲染速度跟不上程序的運(yùn)行速度,就需要人為地去限制程序執(zhí)行的速度。
測(cè)試人員在做Web自動(dòng)化測(cè)試時(shí),一般要等待頁(yè)面元素加載完成后,才能執(zhí)行測(cè)試操作,否則會(huì)報(bào)找不到元素等錯(cuò)誤,這樣就要求在有些測(cè)試場(chǎng)景下加上等待機(jī)制。
最常見(jiàn)的等待機(jī)制有3種:隱式等待、顯示等待和強(qiáng)制等待。
1、隱式等待
我們?cè)跍y(cè)試用例中設(shè)置一個(gè)隱式等待時(shí)間,測(cè)試用例執(zhí)行時(shí)會(huì)按時(shí)間輪詢查找(默認(rèn)0.5秒)元素是否出現(xiàn),如果在輪詢查找的時(shí)間內(nèi)元素沒(méi)出現(xiàn)系統(tǒng)就拋出異常。
隱式等待的作用域是全局的,隱式等待可以在setup方法中設(shè)置,是作用在整個(gè)Session的聲明周期。也就是說(shuō)只要設(shè)置一次隱式等待,后面就不需要再設(shè)置。如果再次設(shè)置隱式等待,那么后一次的設(shè)置會(huì)覆蓋前一次的設(shè)置。
Python版本實(shí)現(xiàn)代碼
self.driver.implicity_wait(30)
Java版本實(shí)現(xiàn)代碼
//隱式等待調(diào)用方式,設(shè)置等待時(shí)間為30秒
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
2、顯示等待
顯示等待是在代碼中定義等待條件,觸發(fā)該條件后再執(zhí)行后續(xù)代碼,這是根據(jù)判斷條件進(jìn)行等待。通俗地講就是,程序每隔一段時(shí)間進(jìn)行一次條件判斷,如果條件成立,則執(zhí)行下一步;否則繼續(xù)等待,直到超過(guò)設(shè)置的最長(zhǎng)時(shí)間。核心用法代碼如下。
Python版本
# 導(dǎo)入顯示等待
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
...
# 設(shè)置10秒的最大等待時(shí)間,等待(By.TAG_NAME,"title")這個(gè)元素被點(diǎn)擊
WebDriverWait(driver,10).until(
? ? expected_conditions element_to_be_clickable((By.TAG_NAME,"title"))
)
...
這里通過(guò)導(dǎo)入expected_conditions這個(gè)庫(kù)來(lái)滿足顯示等待所需的使用場(chǎng)景,但是expected_conditions庫(kù)并不能滿足所有場(chǎng)景,這個(gè)時(shí)候就需要定制化開(kāi)發(fā)一個(gè)庫(kù)來(lái)滿足特定場(chǎng)景,Java版的實(shí)現(xiàn)如下。
Java版本
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
...
//設(shè)置10秒的最大等待時(shí)間,等待(By.tag_Name,"title")這個(gè)元素被點(diǎn)擊
WebDriverWait wait = new WebDriverWait(driver,10);
wait.until(ExpectedConditions.elementToBeClickable(By.tagName("title")));
...
3、強(qiáng)制等待
強(qiáng)制等待是使程序中的線程休眠一定時(shí)間。強(qiáng)制等待一般在隱式等待和顯式等待都不起作用時(shí)使用。
Python版本
# 等待10秒
time.sleep(10)
Java版本
//等待2000毫秒,相當(dāng)于等待2秒
Thread.sleep(2000)