Статьи

PhantomJS с игрой


У вас есть два варианта тестирования на основе браузера с
готовой платформой 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.

  1. Это быстрее
  2. Это без головы, поэтому он не нуждается в дисплее. Это полезно в средах CI, таких как Travis . Да, вы можете использовать Xvfb, но это просто другая зависимость. HtmlUnit также удобен при локальном использовании, поэтому у вас не появляется множество окон браузера при запуске тестов.

Самый большой недостаток — поддержка JavaScript в HtmlUnit довольно средняя. Я всегда сталкивался с проблемами при его использовании, когда делал что-то сложное в JavaScript. Он использует
Mozilla’s Rhino под одеялом. 


Введите
PhantomJS . Это безголовый браузер WebKit с JavaScript API. Основываясь на WebKit, я обнаружил, что он поддерживает JavaScript намного лучше, чем HtmlUnit.  


Так как же интегрировать его в приложение Play?
В несколько шагов:

 

  1. Во-первых, вам нужно установить PhantomJS. Есть несколько способов добиться этого, но я просто использую brew (http://brew.sh/) в OSX. Поэтому я запускаю следующую команду.  
    brew install phantomjs

    На веб-сайте PhantomJS http://phantomjs.org/ есть инструкции для других операционных систем.

  2. Добавьте 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"
    )     
    
  3. Измените тест на использование 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.");
                }
            });
        }
    
  4. Перезапустите тест: 
    $ 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
    
  5. Вы также можете делать скриншоты с 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 . Удачного тестирования!