目前已經與友人,將相關資料整理編譯成一本電子書,因為在鐵人賽時時間比較趕,有些錯誤修正的部分,直接參考電子書,就不同步修正了http://learngeb.readbook.tw/。
與我交接工作的前QA,之前使用的其實是使用Robot Framework的,Robot語法的使用方式,類似於一個一個Keyword所指成,兩個以上的Keyword可以在組成另一個集合可取新的Keyword,但跟平常習慣寫class跟method的我,非常不習慣,它所提供的官方RIDE,也真是會讓人越寫越火大,之後發現有eclipse plugin for robot,但我沒去試,因為我已經對新歡愛不釋手。
*** Test Cases ***
[Documentation] Login Web Site
Login
Logout
*** Variables ***
${BROWSER} firefox
${VALID USER} xxxxx@yyyyyy.com
${VALID PASSWD} xxxxxx
*** Keywords ***
Login
Click Element id=loginPageBtn
Input Username ${VALID USER}
Input Password ${VALID PASSWD}
Submit Credentials
Logout
Click Element css=a[href$='logout']
Sleep 5
轉輾得知了Geb,又把我拉回了物件導向的懷抱,Geb定義了Page和Modules,Page你可以想像成一個一個的頁面(首頁、登入頁、客服頁),Modules則用在,我們有時會把同類的功能放在同組Modules,讓source code可以重複使用,減少維護成本。Geb在控制元素的語法上,也精簡了很多,將在後續會繼續細部的介紹。
class LoginWebSiteSpec extends GebReportingSpec {
def "go to login page"(){
to FrontPage
setLanguageEnglish()
when:
to LoginPage
then:
at LoginPage
}
def "login"(){
when:
login()
then:
loginSuccess()
}
def "logout"(){
to LayoutPage
when:
logoutLink.click()
then:
!isLogin()
}
}
class FrontPage extends Page{
static at = {title == "Front Page"}
static url = ""
static content = {
languageMenu(wait: true) { $('.dropdown-toggle') }
languageEnUS { $('.dropdown-menu li a', 0) }
languageZhTW { $('.dropdown-menu li a', 1) }
loginButton {$("#loginPageBtn")}
privacyText {$('.footer a[href$=privacy]').text()}
shortcutButton {$('#shortcutBtn')}
}
def setLanguageEnUS() {
languageMenu.click()
languageEnUS.click()
}
def setLanguageZhTW() {
languageMenu.click()
languageZhTW.click()
}
def checkLanguageEnUS() {
privacyText == "Privacy"
}
def checkLanguageZhTW() {
privacyText == "隱私"
}
}