Groovy Tutorial(8)使用 Geb 開發 Web Test 網站自動化測試(中)
|
Groovy Tutorial(7)使用 Geb 開發 Web Test 網站自動化測試(上) << 前情 上一篇已初步介紹 Geb 工具的,對於這套瀏覽器自動化解決方案有興趣的讀者,請再跟著本篇提供的範例,動手開始實作自己的程式。以強大的 Selenium WebDriver 為核心,結合類似 jQuery 的 DOM 選取與操作方式,使用 Groovy DSL 易讀易寫的語法開發,使得 Geb 成為受矚目的新一代瀏覽器自動化測試工具。 撰寫 Geb 程式碼Geb 測試程式本身就是 Groovy 原始碼,使用 Groovy Console 或使用個人喜愛的文字編輯器(如 Sublime Text 或 Vim),即可輕鬆撰寫、執行 Geb 程式,完全不需要依賴特定的編輯工具。 以下是一個最簡易的 Geb 程式碼範例,包含所需的 Grapes 相依套件宣告。在裝有 Groovy 與 Firefox 瀏覽器的電腦上即可直接執行。 範例: @Grapes([
@Grab('org.gebish:geb-core:0.9.2'),
@Grab('org.seleniumhq.selenium:selenium-firefox-driver:2.42.0'),
@Grab('org.seleniumhq.selenium:selenium-support:2.42.0')
])
import geb.Browser
Browser.drive {
go 'http://www.codedata.com.tw/'
}
執行方式:終端機執行指令「 瀏覽器基本操作指令
Browser.drive {
// Geb DSL here!!!
}
使用「 go 'http://www.codedata.com.tw/' 在開啟一個網頁畫面時,Geb 會等待網頁主要內容都載入完畢,然後才執行下一行指令。為了確保指定的 URL 被正確打開,而且載入的網頁是我們期望的頁面,最基本的檢核就是先比對網頁標題。在 DSL 區塊中使用 title 變數可以取得網頁標題,它是一個字串(String)型態的變數資料。 例如 CodeData 首頁的標題以「CodeData」文字結尾,我們使用字串的 println title
assert title.endsWith('CodeData')
如果希望 Geb 的任務完成後,就關閉瀏覽器視窗結束程式,可以使用「 close() 另一個結束指令為「 quit() 對於排程執行或是在終端機下執行的 Geb 程式,需要將瀏覽器視窗關閉,才能讓 Groovy 程式停止執行返回 Shell。 Browser.drive {
go 'http://www.codedata.com.tw/'
// 執行一些自動化操作
close()
}
使用 Navigator API使用 Geb 命令瀏覽器開啟一個網頁之後,就可以開始對網頁畫面元素(elements)進行存取或控制。例如取得文字內容或填寫、點選表單元件等,這些流程是瀏覽器自動化的常見操作。 我們需要透過瀏覽器選取一個網頁元素,Geb 透過 Navigator API 提供方便的篩選功能,能夠幫助開發者快速準確找到所需要的網頁元素。 以 CodeData 網站為例,以下範例是找出「搜尋關鍵字」這個文字方塊的表單欄位,並填入「groovy」關鍵字,然後點選旁邊的放大鏡按鈕開始搜尋。 要找到特定的網頁元素,我們需要先觀察網頁的 HTML 原始碼。但是只從 Web Server 回應的 HTML 原始資料,經常不足以取得所需的資訊;現代網站很多前端畫面是由 JavaScript 動態產生,DOM 的內容在網頁讀取後還會有所改變,我們可以搭配瀏覽器的除錯工具,例如在 Google Chrome 瀏覽器的網頁中,只要選取右鍵選單的「檢查元素」就能開啟除錯工具(如下圖)。 ![]() 學會使用網頁除錯工具,是開始撰寫自動化測試程式的第一步。 利用 Navigator API 尋找網頁中特定的元素,通常我們可以利用 HTML 標籤的 id 或 class 屬性,表單欄位也可以用 name 屬性做篩選。 例如 CodeData 網站的搜尋區塊原始碼如下,包含兩個 <div class="search">
<form onsubmit="return bridge();">
<input type="text" value="搜尋關鍵字" class="input" id="keyword" name="keyword">
<input type="button" value=" " class="submit" id="btnSearch" name="btnSearch">
</form>
</div>
以這段 HTML 代碼而言,使用 $('#keyword').value('groovy')
$('#btnSearch').click()
目標元素沒有設定 $('div.search .input').value('groovy')
$('div.search .submit').click()
也可以使用目標元素的某個屬性(attribute)做選取,例如表單元件很適合以 $('input', name: 'keyword').value('groovy')
$('input', name: 'btnSearch').click()
使用 println $('.list .block h3 a').size()
搭配 Groovy 的 $('.list .block h3 a').each { elem ->
println elem.text()
}
以下是 CodeData 網站搜尋功能自動化操作的完整範例程式碼。 @Grapes([
@Grab('org.gebish:geb-core:0.9.2'),
@Grab('org.seleniumhq.selenium:selenium-firefox-driver:2.42.0'),
@Grab('org.seleniumhq.selenium:selenium-support:2.42.0')
])
import geb.Browser
Browser.drive {
go 'http://www.codedata.com.tw/'
$('input', name: 'keyword').value('groovy')
$('input', name: 'btnSearch').click()
$('.list .block h3 a').each { elem ->
println elem.text()
}
}
使用 waitFor 指令許多網站使用前端 JavaScript 技術強化網頁瀏覽效果,特別是使用 AJAX 技術或 SPA(Single-page application)架構的網站,在進行自動化測試時,需要先等待網頁的背景動作完成。例如點選送出指令後,透過 AJAX 更新某些內容,Geb 提供 以 Google reCAPTCHA 的 AJAX Demo 為例,按下「Click Me」按鈕後,會利用 AJAX 載入 Captcha (圖片驗證碼)的區塊,我們可以利用 Browser.drive {
go 'http://www.google.com/recaptcha/demo/ajax'
$('input', value: 'Click Me').click()
waitFor {
$('#recaptcha_area').size() > 0
}
println $('#recaptcha_challenge_image').attr('src')
}
在
如果想改變 waitFor(10) {} // 最長等待時間為 10 秒
waitFor(10, 0.5) {} // 每次判斷條件的間隔時間為 0.5 秒
擷取測試結果自動化測試的每個步驟完成或失敗發生後,我們可以利用 Geb 的報表功能擷取測試結果,包含網頁畫面截圖與當前 HTML 原始碼。使用 Browser.drive {
config.reportsDir = new File('/tmp')
go 'http://www.codedata.com.tw/'
report 'codedata-home'
}
以下是瀏覽器網頁畫面截圖的範例,對自動化測試的任務,保留各階段測試的畫面,可以彙整成一份更詳盡的測試報告。如果要撰寫一個 Web Screen Capture 的程式,使用 Geb 也可以輕鬆完成。
|

Java 學習之路





zhang
07/01good post.