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

2024-05-02

如何使用 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?

Update:该问题的目标是能够在模拟浏览器(例如 PhantomJS)中运行测试,并为特定语言配置浏览器。上面的代码示例只是要求浏览器检测页面中是否有一些本地化文本,但是可以在模拟浏览器中运行的测试类型有很大差异。例如,文本可以在运行时通过 JavaScript 设置。或者我可能想截取屏幕截图并将其与之前的参考屏幕截图进行比较,以测试布局。默认情况下,显然浏览器正在使用计算机的区域设置,这会破坏持续集成测试。所以问题是如何从 Play Framework 测试中配置 PhantomJS。


基于Yasuki Okumura 的论坛留言 https://groups.google.com/d/msg/play-framework/vjAhrsD753E/1g4V4saC48AJ,这可以通过创建一个来完成TestBrowser来自预配置驱动程序的对象。

例如:

In file 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()
    }
  }
}

In file 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 class 会接受 https://github.com/playframework/playframework/blob/31afc82125ed75e25d1d1eda9ea9ae132ce98b7e/framework/src/play-test/src/main/scala/play/api/test/Specs.scala#L49 a WebDriver直接实例化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Play 框架规范中设置 PhantomJSDriver 上的 Accept-Language 的相关文章

随机推荐