groovy,geb(selenium),spockによる自動化テスト その6
gebでjavascriptを利用する
- javascript変数を取得
- メソッド呼び出し
- js追加
script6.html
<html> <title>for javascript</title> <script type="text/javascript"> var var1 = 100; function add(a, b) { return a + b; } </script> <body> </body> </html>
script6_js.groovy
/** * Geb for javascript * * http://www.gebish.org/manual/ * * 1. get variable from javascript * 2. call method * 3. add script */ import geb.Browser def testPage = new File('src/main/java/html/script6.html') Browser.drive { // 指定URLでブラウザオープン go testPage.toURI().toString() // JavascriptInterface geb.Browser.getJs() // get variable assert js.var1 == 100 // 2. call method assert js.add(1, 10) == 11 // 3. add script assert js."document.title" == "for javascript" js."alert('add script')" sleep 10 * 1000 }.quit()
gebでpopupを制御する
SeleniumのWebDriverはalert, confirm, promptに対するソリューションを提供してないらしい。
gebでは、AlertAndConfirmSupporでalert,confirmに対する操作が可能。
※ promptはサポートしてないらしい。
API from AlertAndConfirmSuppor
alert
- def withAlert(Closure actions)
- def withAlert(Map params, Closure actions)
- void withNoAlert(Closure actions) → 意図してない個所でalertが発生してするとAssertionError発生
confirm
- def withConfirm(boolean ok, Closure actions)
- def withConfirm(Closure actions)
- def withConfirm(Map params, Closure actions)
- def withConfirm(Map params, boolean ok, Closure actions)
- void withNoConfirm(Closure actions)
/** * Geb for popup * * http://www.gebish.org/manual/ * * use AlertAndConfirmSupport for alert,confirm,prompt * * Geb does not provide any support for prompt() due to its infrequent and generally discouraged use. */ import geb.Browser import geb.Page def testPage = new File('src/main/java/html/script7.html') Browser.drive { // baseUrl設定 config.baseUrl = new File(testPage.getAbsolutePath()).toURI() to PopupPage assert withAlert(wait: true) { showAlert.click() } == "alert!" //assert withAlert(wait: true) { showAlert.click() } == "some alert!" // エラー // actionsでalertが表示されるとAssertionError発生する withNoAlert { $("input", name: "dontShowAlert").click() } assert withConfirm(true) { showConfirm.click() } == "confirm?" sleep 2 * 1000 assert withConfirm(false) { showConfirm.click() } == "confirm?" sleep 10 * 1000 }.quit() class PopupPage extends Page{ // baseURL + static url = "script7.html" static content = { showAlert {$("input", name: "showAlert")} donotShowAlert {$("input", name: "dontShowAlert")} showConfirm {$("input", name: "showConfirm")} } }
waitFor
Ajaxなので非同期処理の際に、処理完了を待つ際に使う。
geb.PageクラスのAPIである。
/** * Geb for waitFor * http://www.gebish.org/manual/ * Ajaxなど処理待ちが発生する場合、waitForを利用して待つことができる * * API: * * waitFor {} デフォルト * waitFor(10) {} 最長10秒待ち * waitFor(10, 0.5){} 最長10秒待ち、 0.5秒間隔 * waitFor("quick"){} GebConfig.groovyの設定 * * * Geb does not provide any support for prompt() due to its infrequent and generally discouraged use. */ import geb.Browser Browser.drive { go 'https://www.google.com/recaptcha/demo/ajax' $('input', value: 'Click Me').click() waitFor { $('#recaptcha_challenge_image').size() > 0 } println $('#recaptcha_challenge_image').attr('src') sleep 10 * 1000 }.quit()
WebAPI呼び出し
{ "name": "Alex", "age": "20" }
/** * Geb for calling api * http://www.gebish.org/manual/ */ import geb.Browser import groovy.json.JsonSlurper def testPage = new File('src/main/java/json/json-data1.json') Browser.drive { URL apiUrl = testPage.toURL() def data = new JsonSlurper().parseText(apiUrl.text) println data.name println data.age assert data.name == 'Alex' assert data.age == '20' }.quit()