2014-01-14 76 views
4

如何能在PhantomJSDriver在一個播放框架2.2規範特定的Accept-Language語言頭配置?設置接受語言上PhantomJSDriver在遊戲框架規範

鑑於此代碼:

import org.specs2.mutable._ 
import org.specs2.runner._ 
import org.junit.runner._ 
import play.api.i18n._ 
import play.api.test._ 
import play.api.test.Helpers._ 
import org.openqa.selenium.phantomjs.PhantomJSDriver 

@RunWith(classOf[JUnitRunner]) 
class IntegrationSpec extends Specification { 

    "Application" should { 

    "work from within a browser" in new WithBrowser(webDriver = classOf[PhantomJSDriver]) { 
     browser.goTo("http://localhost:" + port) 
     implicit val lang = Lang("pt-BR") 
     val expected = Messages("home.index.featured_lead") 
     browser.pageSource must contain(expected) 
    } 
    } 
} 

我怎樣才能確保通過goTO產生的請求將與特定Accept-Language頭,例如發送pt-BR

更新:問題的目標是能夠在爲特定語言配置瀏覽器的情況下在模擬瀏覽器(例如PhantomJS)中運行測試。上面的代碼示例只是要求瀏覽器檢測頁面中是否存在一些本地化文本,但可以在模擬瀏覽器中運行的測試類型差異很大。例如,文本可能在運行時通過JavaScript設置。或者我可能想要截圖並將其與之前的參考屏幕截圖進行比較,以測試佈局。默認情況下,顯然瀏覽器正在使用機器的語言環境,這打破了持續的集成測試。所以問題是如何從Play Framework測試配置PhantomJS。

回答

3

根據a forum message by Yasuki Okumura,可以通過從預配置的驅動程序創建一個TestBrowser對象來完成此操作。

例如:

在文件WithPhantomJS.scala

package com.myproject.website.tests 

import org.openqa.selenium.remote.DesiredCapabilities 
import org.openqa.selenium.phantomjs.PhantomJSDriver 
import org.openqa.selenium.phantomjs.PhantomJSDriverService 
import org.specs2.execute.AsResult 
import org.specs2.execute.Result 
import org.specs2.mutable.Around 
import org.specs2.specification.Scope 
import play.api.i18n.Lang 
import play.api.test.Helpers._ 
import play.api.test.FakeApplication 
import play.api.test.TestBrowser 
import play.api.test.TestServer 
import scala.collection.JavaConverters._ 

abstract class WithPhantomJS(val additionalOptions: Map[String, String] = Map()) extends Around with Scope { 

    implicit def app = FakeApplication() 

    implicit def port = play.api.test.Helpers.testServerPort 

    lazy val browser: TestBrowser = { 
    val defaultCapabilities = DesiredCapabilities.phantomjs 
    val additionalCapabilities = new DesiredCapabilities(additionalOptions.asJava) 
    val capabilities = new DesiredCapabilities(defaultCapabilities, additionalCapabilities) 
    val driver = new PhantomJSDriver(capabilities) 
    TestBrowser(driver, Some("http://localhost:" + port)) 
    } 

    override def around[T: AsResult](body: => T): Result = { 
    try { 
     running(TestServer(port, app))(AsResult.effectively(body)) 
    } finally { 
     browser.quit() 
    } 
    } 
} 

在文件IntegrationSpec.scala

package com.myproject.website.tests 

import com.myproject.common.helpers._ 
import org.junit.runner._ 
import org.specs2.runner._ 
import play.api.i18n._ 
import play.api.test._ 
import play.api.test.Helpers._ 
import org.specs2.mutable.Specification 
import org.openqa.selenium.phantomjs.PhantomJSDriverService 

/** 
* An integration test will fire up a whole play application in a real (or headless) browser. 
*/ 
@RunWith(classOf[JUnitRunner]) 
class IntegrationSpec extends Specification { 

    val enUSLangCode = "en-US" 
    val ptBRLangCode = "pt-BR" 

    val enUSOptions = getPhantomJSLanguageOption(enUSLangCode) 
    val ptBROptions = getPhantomJSLanguageOption(ptBRLangCode) 

    "Application" should { 

    "work from within a browser with en-US language" in new WithPhantomJS(enUSOptions) { 
     browser.goTo("http://localhost:" + port) 
     implicit val lang = Lang(enUSLangCode) 
     val expected = Messages("home.index.featured_lead") 
     browser.pageSource must contain(expected) 
    } 

    "work from within a browser with pt-BR language" in new WithPhantomJS(ptBROptions) { 
     browser.goTo("http://localhost:" + port) 
     implicit val lang = Lang(ptBRLangCode) 
     val expected = Messages("home.index.featured_lead") 
     browser.pageSource must contain(expected) 
    } 

    } 

    private def getPhantomJSLanguageOption(langCode: String) = 
    Map(PhantomJSDriverService.PHANTOMJS_PAGE_CUSTOMHEADERS_PREFIX + "Accept-Language" -> langCode) 

} 

此外,需要這個依賴於build.sbt

libraryDependencies += "com.github.detro.ghostdriver" % "phantomjsdriver" % "1.0.4" % "test" 

在播放框架2.3時,WithBrowser類直接will accept一個WebDriver實例。

+0

不幸的是,這種停止升級到2.4打(我假設順便升級specs2的版本一樣)後,爲我工作。 –

0

根據在關於閱讀響應頭的問題this評論,它看起來像webdriver的沒有設置請求頭或檢查響應頭的API。該評論建議使用HTTP客戶端(Play具有WS Library)來測試請求和響應標頭。

考慮到這些信息,您可以使用WS Library檢查服務器是否使用與Accept-Language標頭相對應的語言進行響應,並且您所做的任何前端測試都可以認爲正確遵守了標頭。

+0

謝謝您的回答。不過,建議的解決方法還不夠。我知道我可以發送HTTP請求並獲得HTTP響應,但是這個問題是關於在模擬瀏覽器中運行的測試(在這種情況下,PhantomJS)。我沒有試圖檢索Accept-Language語言頭文件。我試圖找出如何配置模擬瀏覽器以使用特定語言運行。這使得各種測試的WS庫不能做,如在客戶機上運行測試JavaScript代碼,比較截屏等 –

+1

PhantomJs絕對有設置Accept-Language頭的能力。你可以寫你的測試在JavaScript中直接由phantomjs運行嗎?你會失去很多硒的功能,但你可以做你想要的所有客戶端驗證。你甚至可以通過測試腳本執行phantomjs可執行文件。 –

+0

感謝您的信息。如果沒有使用Scala和Play Framework的解決方案,我會記住這一點。 –