web的自動化測試中,我們經常會遇到這樣一種情況:點擊1個按鈕,頁面上會彈出1個iframe,這時候腳本就需要去等待iframe加載完畢才能進行后續的操作。
在這種情況下,我們一般的處理思路是等待被等待對象上的某個子元素出現,當這個子元素出現時我們就認為該對象已經加載完畢,代碼可以繼續往下執行了。
selenium-webdriver為我們提供了一個Wait類來完成類似的等待功能。
下面的html代碼實現了這樣的一種效果:點擊click按鈕5秒鍾后,頁面上會出現一個紅色的div塊。我們需要寫一段自動化腳本去捕獲這個出現的div,然后高亮之。
set_timeout.html
<html>
<head>
<title>Set Timeout</title>
<style>
.red_box {background-color: red; width =
20
%; height: 100px; border: none;}
</style>
<script>
function show_div(){
setTimeout(
"create_div()"
,
5000
);
}
function create_div(){
d = document.createElement(
'div'
);
d.className =
"red_box"
;
document.body.appendChild(d);
}
</script>
</head>
<body>
<button id =
"b"
onclick =
"show_div()"
>click</button>
</body>
</html>
require
'selenium-webdriver'
dr = Selenium::WebDriver.
for
:ie
select_file =
'file:///'
.concat
File
.expand_path(
File
.join(
File
.dirname(
__FILE__
),
'set_timeout.html'
))
dr.navigate.to select_file
dr.find_element(
:id
=>
'b'
).click
wait = Selenium::WebDriver::Wait.
new
({
:timeout
=>
30
})
box = wait.
until
{dr.find_element(
:css
=>
'.red_box'
)}
dr.execute_script(
'arguments[0].style.border = "5px solid yellow"'
, box)
#div will be highlight
Wait類的構造方法Wait.new接收1個hash參數。上面代碼中使用:timeout這個key值表示最長等待時間。
Wait類的until方法接收1個block代碼塊,如果代碼塊返回值不為true的話,該方法將一直等待直到達到最長等待時間為止。如果一旦代 碼塊中的值為true了,則返回該代碼塊的返回值。 box = wait.until {dr.find_element(:css => '.red_box')}的作用就是等待class為red_box的div出現並返回該div對象。
進一步的思想下,如果某些頁面在加載完成后會執行一些js函數,這些函數會延遲對dom樹進行一些操作或者進行一些異步請求的處理,那么 webdriver目前是無法智能的等待這些函數執行完畢的,所以有時候就會出現頁面在沒有加載完畢的情況下(實際上dom已經加載完畢,只是異步請求或 延遲函數正在執行),webdriver繼續進行后續代碼的執行情況。這時候我們就需要靈活的使用Wait類進行等待了。