scala – 在Play框架规范中在PhantomJSDriver上设置Accept-Language

如何在Play Framework 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.

解决方法

基于 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"

在Play Framework 2.3中,WithBrowser类will accept直接是WebDriver实例.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...