問題
在WEB自動(dòng)化測(cè)試中,頁面元素的記載需要時(shí)間,如果需要操作的元素沒有在一定時(shí)間內(nèi)出現(xiàn)洒沦,那么腳本將出錯(cuò)并且終止幕与,這將影響自動(dòng)化腳本的執(zhí)行效率挑势。
還有一個(gè)常見的場(chǎng)景就是需要等待某個(gè)元素的出現(xiàn),或者等待元素的某個(gè)屬性發(fā)生變化啦鸣,例如處于被激活狀態(tài)潮饱,然后再進(jìn)行操作。這些都需要在腳本中對(duì)等待進(jìn)行相應(yīng)的處理诫给。
解決方法
在selenium中香拉,有兩種等待:
- 顯示等待 Explicit Waits
顯示等待是通過代碼,等待到某個(gè)一定的條件發(fā)生中狂,然后繼續(xù)進(jìn)行代碼凫碌。最簡(jiǎn)單的處理是用sleep
,它將條件設(shè)置為等待的確切時(shí)間段胃榕。 這種處理方式的缺點(diǎn)是無論條件什么時(shí)候滿足盛险,都要等待固定的時(shí)間,嚴(yán)重影響了執(zhí)行的效率勋又。更加合理的方法是使用WebDriverWait與ExpectedCondition結(jié)合苦掘, 等待到某個(gè)條件出現(xiàn)的時(shí)候就立即繼續(xù)執(zhí)行腳本。 - 隱式等待 Implicit Waits
隱式等待就是告訴WebDriver在查找一個(gè)或多個(gè)元素(如果不是立即可用的)時(shí)輪詢DOM一段時(shí)間楔壤。 默認(rèn)設(shè)置為0鹤啡。一旦設(shè)置,隱式等待就會(huì)在整個(gè)WebDriver對(duì)象實(shí)例的生命周期中生效蹲嚣。
實(shí)例分析
顯式等待
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
driver.get "http://www.reibang.com/faqs"
wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
begin
element = wait.until { driver.find_element(:class => "category-title") }
ensure
driver.quit
end
Selenium::WebDriver::Wait
類是selenium中處理等待的類递瑰。默認(rèn)的超時(shí)是Selenium::WebDriver::Wait::DEFAULT_TIMEOUT = 5
, 也就是5s祟牲。默認(rèn)的檢查條件的周期是Selenium::WebDriver::Wait:: DEFAULT_INTERVAL = 0.2
, 也就是每0.2s檢查一次條件是否成立泣矛。
在創(chuàng)建wait
對(duì)象的時(shí)候可以設(shè)置你需要的:timeout
值疲眷。超過這個(gè)等待時(shí)間條件還是FALSE的話,將拋出Selenium::WebDriver::Error::TimeOutError
您朽。
Selenium::WebDriver::Wait
類的實(shí)例方法until
是用來判定條件是否在:timeout
內(nèi)為true
狂丝。
判定條件可以設(shè)置為和元素相關(guān)的方法,例如:
element.enabled?
, element.displayed?
哗总。還可以通過獲取元素的CSS屬性來進(jìn)行判斷几颜,實(shí)現(xiàn)豐富的等待功能。
隱式等待
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
driver.manage.timeouts.implicit_wait = 10 # seconds
driver.get "http://www.reibang.com/faqs"
element = driver.find_element(:class => "category-title")
隱式等待的設(shè)置并不是針對(duì)某個(gè)特定的條件讯屈,而是判斷是否能夠在DOM中找到元素蛋哭,也就是Selenium::WebDriver
類的實(shí)例方法find_element
是否成功的返回元素。
這個(gè)設(shè)置是通過執(zhí)行Selenium::WebDriver::Timeouts
類的實(shí)例方法implicit_wait
來實(shí)現(xiàn)涮母。而timeouts
是Selenium::WebDriver::Options
類的實(shí)例方法谆趾。要得到Selenium::WebDriver::Options
類的實(shí)例,需要執(zhí)行Selenium::WebDriver
的實(shí)例方法manage
叛本。
需要注意的是沪蓬,這個(gè)值的設(shè)定將在Selenium::WebDriver
的實(shí)例對(duì)象的整個(gè)生命周期生效,所以一旦設(shè)定一個(gè)較大的值来候,將影響整個(gè)腳本的執(zhí)行效率跷叉。