У вас есть два варианта тестирования на основе браузера с готовой платформой Play: Firefox или
HtmlUnit .
Когда вы создаете новое приложение Play, вы получаете следующий интеграционный тест. Переключите константу HTMLUNIT на FIREFOX, чтобы начать использовать Firefox через веб-драйвер.
@Test public void test() { running(testServer(3333, fakeApplication(inMemoryDatabase())), HTMLUNIT, new Callback() { public void invoke(TestBrowser browser) { browser.goTo("http://localhost:3333"); assertThat(browser.pageSource()).contains("Your new application is ready."); } }); }
HtmlUnit имеет пару преимуществ по сравнению с реальным браузером, таким как Firefox.
- Это быстрее
- Это без головы, поэтому он не нуждается в дисплее. Это полезно в средах CI, таких как Travis . Да, вы можете использовать Xvfb, но это просто другая зависимость. HtmlUnit также удобен при локальном использовании, поэтому у вас не появляется множество окон браузера при запуске тестов.
Самый большой недостаток — поддержка JavaScript в HtmlUnit довольно средняя. Я всегда сталкивался с проблемами при его использовании, когда делал что-то сложное в JavaScript. Он использует
Mozilla’s Rhino под одеялом.
Введите
PhantomJS . Это безголовый браузер WebKit с JavaScript API. Основываясь на WebKit, я обнаружил, что он поддерживает JavaScript намного лучше, чем HtmlUnit.
Так как же интегрировать его в приложение Play? В несколько шагов:
- Во-первых, вам нужно установить PhantomJS. Есть несколько способов добиться этого, но я просто использую brew (http://brew.sh/) в OSX. Поэтому я запускаю следующую команду.
brew install phantomjs
На веб-сайте PhantomJS http://phantomjs.org/ есть инструкции для других операционных систем.
- Добавьте GhostDriver , который является реализацией WebDriver для PhantomJS, в свое приложение Play. Если у вас есть файл Build.scala (Play 2.1.X и опционально Play 2.2.X), добавьте Ghostdriver, отредактировав файл Build.scala и добавив зависимость таким образом.
val appDependencies = Seq( // Add your project dependencies here, javaCore, javaJdbc, javaEbean, "com.github.detro.ghostdriver" % "phantomjsdriver" % "1.0.4" % "test" )
Или, если вы используете Play 2.2.X и выше и имеете только файл build.sbt , добавьте GhostDriver, отредактировав файл build.sbt и добавив зависимость следующим образом:
libraryDependencies ++= Seq( javaJdbc, javaEbean, cache, "com.github.detro.ghostdriver" % "phantomjsdriver" % "1.0.4" % "test" )
- Измените тест на использование GhostDriver, передав класс PhantomJSDriver вместо константы HTMLUNIT:
@Test public void test() { running(testServer(3333, fakeApplication(inMemoryDatabase())), org.openqa.selenium.phantomjs.PhantomJSDriver.class, new Callback() { public void invoke(TestBrowser browser) { browser.goTo("http://localhost:3333"); assertThat(browser.pageSource()).contains("Your new application is ready."); } }); }
- Перезапустите тест:
$ play test
Если все работает правильно, вы должны получить вывод, подобный следующему:
2013-09-19 11:29:06.727 phantomjs[4326:707] *** WARNING: Method userSpaceScaleFactor in class NSView is deprecated on 10.7 and later. It should not be used in new applications. Use convertRectToBacking: instead. PhantomJS is launching GhostDriver... [INFO - 2013-09-19T01:29:06.832Z] GhostDriver - Main - running on port 15803 [INFO - 2013-09-19T01:29:06.993Z] Session [e04d1ec0-20ca-11e3-89ad-45bbd56cac5d] - _decorateNewWindow - page.settings: {"XSSAuditingEnabled":false,"javascriptCanCloseWindows":true,"javascriptCanOpenWindows":true,"javascriptEnabled":true,"loadImages":true,"localToRemoteUrlAccessEnabled":false,"userAgent":"Mozilla/5.0 (Macintosh; PPC Mac OS X) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.2 Safari/534.34","webSecurityEnabled":true} [INFO - 2013-09-19T01:29:06.993Z] Session [e04d1ec0-20ca-11e3-89ad-45bbd56cac5d] - page.customHeaders: - {} [INFO - 2013-09-19T01:29:06.993Z] Session [e04d1ec0-20ca-11e3-89ad-45bbd56cac5d] - CONSTRUCTOR - Desired Capabilities: {"platform":"ANY","browserName":"phantomjs","version":""} [INFO - 2013-09-19T01:29:06.993Z] Session [e04d1ec0-20ca-11e3-89ad-45bbd56cac5d] - CONSTRUCTOR - Negotiated Capabilities: {"browserName":"phantomjs","version":"1.9.2","driverName":"ghostdriver","driverVersion":"1.0.4","platform":"mac-10.8 (Mountain Lion)-64bit","javascriptEnabled":true,"takesScreenshot":true,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"}} [INFO - 2013-09-19T01:29:06.993Z] SessionManagerReqHand - _postNewSessionCommand - New Session Created: e04d1ec0-20ca-11e3-89ad-45bbd56cac5d [INFO - 2013-09-19T01:29:07.949Z] ShutdownReqHand - _handle - About to shutdown [info] IntegrationTest [info] + IntegrationTest.test [info] [info] [info] Total for test IntegrationTest [info] Finished in 0.0 seconds
- Вы также можете делать скриншоты с PhantomJS, который очень полезен для диагностики сбоев и отладки.
@Test public void test() { running(testServer(3333, fakeApplication(inMemoryDatabase())), org.openqa.selenium.phantomjs.PhantomJSDriver.class, new Callback() { public void invoke(TestBrowser browser) { browser.goTo("http://localhost:3333"); assertThat(browser.pageSource()).contains("Your new application is ready."); browser.takeScreenShot("/tmp/screenshot.jpg"); } }); }
Я создал пример приложения здесь с установленными зависимостями:
https://github.com/codingricky/sample-play . Удачного тестирования!