如何在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实例.