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

时间:2014-01-14 17:58:52

标签: scala selenium playframework phantomjs playframework-2.2

如何在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。

2 个答案:

答案 0 :(得分: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"

在Play Framework 2.3中,直接WithBrowserwill acceptWebDriver实例。

答案 1 :(得分:0)

根据有关阅读响应标头的问题的this评论,看起来WebDriver没有用于设置请求标头或检查响应标头的API。该评论建议使用HTTP客户端(Play具有WS Library)来测试请求和响应标头。

根据这些信息,您可以使用WS库检查服务器是否使用与Accept-Language标头对应的语言进行响应,并且您执行的任何前端测试都可以假定标头正在被正确遵守