Geb 0.10ã®æ–°æ©Ÿèƒ½ç´¹ä»‹ #gadvent
ã¯ã˜ã‚ã«
ã“ã‚Œã¯G* Advent Calendarã®5日目ã®è¨˜äº‹ã§ã™ã€‚今日ã¯Geb0.10ã®æ–°æ©Ÿèƒ½ã«ã¤ã„ã¦æ›¸ãã¾ã™ã€‚明日ã¯id:grimrose ã•ã‚“ã®Ratpackã«ã¤ã„㦠ã§ã™ã€‚
概è¦
Gebã¯Webアプリケーションã®GUIテストライブラリã§ã€Selenium WebDriverã®Groovyラッパーã«ãªã£ã¦ã„ã¾ã™ã€‚ 最近Geb 0.10ãŒãƒªãƒªãƒ¼ã‚¹ã•ã‚ŒãŸã®ã§ã€è¨€èªžé¢ã«ãŠã‘る新機能を紹介ã—ã¾ã™ã€‚ビルドツール連æºã‚„BrowserStack連æºãŒå¼·åŒ–ã•ã‚Œã¦ã„ã¾ã™ãŒã€ãã®ç´¹ä»‹ã¯ã¾ãŸåˆ¥ã®æ©Ÿä¼šã«ã€‚
Geb 0.10ã®æ–°æ©Ÿèƒ½
- CSSã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒå®¹æ˜“ã«ãªã£ãŸ
- 兄弟è¦ç´ ã‚„åè¦ç´ ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒå®¹æ˜“ã«ãªã£ãŸ
- クリック後ã«éžåŒæœŸå‡¦ç†ãŒå®Ÿè¡Œã•ã‚Œã‚‹ã‚ªãƒ–ジェクトã«waitを指定ã§ãるよã†ã«ãªã£ãŸ
CSSã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒå®¹æ˜“ã«ãªã£ãŸ
PageObjectã ã£ãŸã‚Šã€ç›´æŽ¥å–å¾—ã—ãŸã‚ˆã†ãªNavigator(ã„ã‚ゆるDOMè¦ç´ )ã«é©ç”¨ã•ã‚Œã¦ã„ã‚‹cssã®å€¤ã‚’å–å¾—ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ 基本的ã«ã¯
Navigator.css("cssã®ãƒ—ãƒãƒ‘ティå")
ã®ã‚ˆã†ãªæ„Ÿã˜ã§ã™ã€‚ 下記ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã€‚
def "対象ã®DOMã«é©ç”¨ã•ã‚Œã¦ã„ã‚‹CSSã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹"(){ given:"Topページã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹" to TopPage when:"é©ç”¨ã•ã‚Œã¦ã„ã‚‹CSSã‚’å–å¾—ã™ã‚‹" def font = $("input", name:"j_username").css("font-family") def color = $("input", name:"j_username").css("background-color") then:"ヘッダ用ã®ãƒ•ã‚©ãƒ³ãƒˆã¨è‰²ãŒé©ç”¨ã•ã‚Œã¦ã„ã‚‹" // 実際ã«ã¯ã“ã†ã„ã£ãŸã‚‚ã®ã¯å…±é€šåŒ–ã—ã¦ãŠãã‘ã©ã€èª¬æ˜Žã®ãŸã‚ã« font == "\"Helvetica Neue\",Helvetica,Arial,sans-serif" color == "rgba(255, 255, 255, 1)" }
ã“ã®é·ç§»ã‚’ã—ãŸã‚‰ã€ã“ã®ã‚ˆã†ãªè¦‹ãŸç›®ãŒã‚ãŸã£ã¦ã„ã¦ã»ã—ã„。ã¨ã„ã†ã®ã¯å…±é€šçš„ã«æ›¸ã„ã¦ãŠãã¨ã€ã¡ã‚‡ã“ã£ã¨ä¾¿åˆ©ã§ã™ã€‚
兄弟è¦ç´ ã‚„åè¦ç´ ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒå®¹æ˜“ã«ãªã£ãŸ
PageObjectã ã£ãŸã‚Šã€ç›´æŽ¥å–å¾—ã—ãŸã‚ˆã†ãªNavigator(ã„ã‚ゆるDOMè¦ç´ )ã®éš£ã‚„åè¦ç´ ã‚’å–å¾—ã™ã‚‹ã®ãŒå®¹æ˜“ã«ãªã‚Šã¾ã—ãŸã€‚ã¾ãŸã€ã‚ã‚‹æ¡ä»¶ã«åˆè‡´ã™ã‚‹åè¦ç´ ã¨ã„ã†æ„Ÿã˜ã®å–å¾—ã‚‚ã§ãã¾ã™ã€‚ 基本的ã«ã¯
- Navigator.next()
- Navigator.next("æ¡ä»¶çš„ãª")
- Navigator.nextAll()
- Navigator.children()
ã®ã‚ˆã†ãªæ„Ÿã˜ã§ã™ã€‚詳細ã¯Navigatorクラスã®API一覧を見るã¨ã‚ˆã„ã§ã—ょã†ã€‚
下記ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã€‚
def "対象ã®DOMã®å…„弟ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹"(){ given:"Topページã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹" to TopPage when:"兄弟è¦ç´ ã‚’å–å¾—ã™ã‚‹" def userNameSiblings = $("input", id:"remember_me").next() then:"隣ã«ã¯ãƒ†ã‚ストã§è¡¨ç¤ºãŒã‚ã‚‹" userNameSiblings.text() == "Remember me" }
クリック後ã«éžåŒæœŸå‡¦ç†ãŒå®Ÿè¡Œã•ã‚Œã‚‹ã‚ªãƒ–ジェクトã«waitを指定ã§ãるよã†ã«ãªã£ãŸ
ボタンをクリックã—ãŸã‚ã¨ã«ã¯waitFor {//処ç†}ã¨ã—ãŸã‚Šã€sleep();//処ç†ã¨ã—ãŸã‚Šã—ã¦ã„ã‚‹ã“ã¨ãŒã‚ã‚‹ã¨æ€ã„ã¾ã™ãŒã€ã“れをPageObjectå´ã®å®šç¾©ã«ç§»ã™é¸æŠžè‚¢ãŒã§ãã¾ã—ãŸã€‚
object_name(toWait:true) { Navigator } ã®ã‚ˆã†ãªæ„Ÿã˜ã§ã€toWaitã¨ã¤ã‘ã‚‹ã¨waitã—ã¾ã™ã€‚toWaitã«ã¯waitã«æŒ‡å®šã™ã‚‹ã®ã¨åŒã˜ã‚ˆã†ãªå€¤ã‚’指定ã§ãã¾ã™ã€‚(trueã¨ã‹GebConfig.groovyã§æŒ‡å®šã—ãŸã‚«ãƒ†ã‚´ãƒªãªã©ï¼‰
class ExamplePage extends Page { static content = { helpButton(to: HelpPage, toWait: true) { $("button#help") } //page change is asynchronous, e.g. an ajax call is involved } }
ã“ã†ã™ã‚‹ã¨ãƒ†ã‚¹ãƒˆã‚³ãƒ¼ãƒ‰å´ã§ä¾‹ãˆã°ã€
to ExamplePage helpButton.click() waitFor { at HelpPage }
ã ã£ãŸã®ãŒã€ã“ã†ãªã‚Šã¾ã™ã€‚
to ExamplePage helpButton.click()
ã©ã¡ã‚‰ã§ã‚‚ã„ã„ã¨ã¯æ€ã†ã®ã§ã€å¥½ã¿ã®å•é¡Œã§ã—ょã†ã‹ã。ã§ã‚‚ã€ãƒ†ã‚¹ãƒˆã‚³ãƒ¼ãƒ‰å´ã ã¨DRYã«ãªã‚‰ãªã„ã¨ã„ã†è©±ã‚‚ã‚ã‚‹ã®ã§ã€toWaitã®ã»ã†ãŒã„ã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
ã¾ã¨ã‚
HTMLç³»ã®ãƒ†ã‚¹ãƒˆã¯å€‹äººçš„ã«ã¯æœ€è¿‘ã¯ã‚‚ã†altJSçš„ãªã‚„ã¤ã§æ›¸ã„ãŸã»ã†ãŒã„ã„よãªãƒ¼ã¨ã¯æ€ã†ã®ã§ã™ãŒã€Geb+Spockã®ä¾¿åˆ©ã•ã«è² ã‘る日々ãªã®ã§ã€ã“ã†ã„ã£ãŸç´°ã‹ã„テクニックをã¤ã‹ã£ã¦ã„ãã®ã‚‚ã„ã„ã‹ã¨æ€ã„ã¾ã™ã€‚