From 99f5776be55fa9bacd48832742682d2b7d78062f Mon Sep 17 00:00:00 2001 From: George Shakhnazaryan Date: Sun, 17 Apr 2016 22:54:35 -0500 Subject: [PATCH] Fix #46: Add ability to pass `ChromeOptions` to the `ChromeDriver`. I'm running tests in a Docker container (https://hub.docker.com/r/gshakhn/sbt-firefox-chromium/). Chrome and Docker don't play well together unless you pass `--no-sandbox` to Chrome (elgalu/docker-selenium#9) This change lets me set pass in `ChromeOptions` with the custom argument to Chrome. This change is binary backwards incompatible due to changing the existing `Chrome` and `Firefox` objects to classes. --- README.md | 4 ++-- build.sbt | 4 ++-- project/BinaryIncompatibilities.scala | 12 +++++++++++- .../org/scalajs/jsenv/selenium/Chrome.scala | 18 ++++++++++++++---- .../org/scalajs/jsenv/selenium/Firefox.scala | 11 ++++++++++- 5 files changed, 39 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 89295e3..540e3a4 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,8 @@ jsEnv := new org.scalajs.jsenv.selenium.SeleniumJSEnv(BROWSER) // Apply to tests jsEnv in Test := new org.scalajs.jsenv.selenium.SeleniumJSEnv(BROWSER) ``` -where the `BROWSER` can be either `org.scalajs.jsenv.selenium.Firefox` or -`org.scalajs.jsenv.selenium.Chrome`. +where the `BROWSER` can be either `org.scalajs.jsenv.selenium.Firefox()` or +`org.scalajs.jsenv.selenium.Chrome()`. When executing the program with `run` a new browser window will be created, the code will be executed in it and finally the browser will close itself. diff --git a/build.sbt b/build.sbt index e877d05..9fb16ff 100644 --- a/build.sbt +++ b/build.sbt @@ -118,7 +118,7 @@ lazy val seleniumJSEnvTest: Project = project. enablePlugins(ScalaJSJUnitPlugin). settings(testSettings). settings( - jsEnv := new SeleniumJSEnv(Firefox) + jsEnv := new SeleniumJSEnv(Firefox()) ) lazy val seleniumJSHttpEnvTest: Project = project. @@ -126,6 +126,6 @@ lazy val seleniumJSHttpEnvTest: Project = project. enablePlugins(ScalaJSJUnitPlugin). settings(testSettings). settings( - jsEnv := new SeleniumJSEnv(Firefox). + jsEnv := new SeleniumJSEnv(Firefox()). withMaterializer(new CustomFileMaterializer("tmp", "http://localhost:8080/tmp")) ) diff --git a/project/BinaryIncompatibilities.scala b/project/BinaryIncompatibilities.scala index 3b262fc..2c7522b 100644 --- a/project/BinaryIncompatibilities.scala +++ b/project/BinaryIncompatibilities.scala @@ -7,6 +7,16 @@ object BinaryIncompatibilities { ProblemFilters.exclude[MissingMethodProblem]("org.scalajs.jsenv.selenium.SeleniumBrowser.setupConsoleCapture"), ProblemFilters.exclude[MissingMethodProblem]("org.scalajs.jsenv.selenium.BrowserDriver.newConsoleLogsIterator"), ProblemFilters.exclude[MissingMethodProblem]("org.scalajs.jsenv.selenium.Firefox#FirefoxDriver.newConsoleLogsIterator"), - ProblemFilters.exclude[MissingMethodProblem]("org.scalajs.jsenv.selenium.Chrome#ChromeDriver.newConsoleLogsIterator") + ProblemFilters.exclude[MissingMethodProblem]("org.scalajs.jsenv.selenium.Chrome#ChromeDriver.newConsoleLogsIterator"), + ProblemFilters.exclude[MissingTypesProblem]("org.scalajs.jsenv.selenium.Chrome$"), + ProblemFilters.exclude[MissingMethodProblem]("org.scalajs.jsenv.selenium.Chrome.newDriver"), + ProblemFilters.exclude[MissingMethodProblem]("org.scalajs.jsenv.selenium.Chrome.initFiles"), + ProblemFilters.exclude[MissingMethodProblem]("org.scalajs.jsenv.selenium.Chrome.name"), + ProblemFilters.exclude[MissingMethodProblem]("org.scalajs.jsenv.selenium.Chrome#ChromeDriver.this"), + ProblemFilters.exclude[MissingTypesProblem]("org.scalajs.jsenv.selenium.Firefox$"), + ProblemFilters.exclude[MissingMethodProblem]("org.scalajs.jsenv.selenium.Firefox.newDriver"), + ProblemFilters.exclude[MissingMethodProblem]("org.scalajs.jsenv.selenium.Firefox.initFiles"), + ProblemFilters.exclude[MissingMethodProblem]("org.scalajs.jsenv.selenium.Firefox.name"), + ProblemFilters.exclude[MissingMethodProblem]("org.scalajs.jsenv.selenium.Firefox#FirefoxDriver.this") ) } diff --git a/seleniumJSEnv/src/main/scala/org/scalajs/jsenv/selenium/Chrome.scala b/seleniumJSEnv/src/main/scala/org/scalajs/jsenv/selenium/Chrome.scala index d7402c1..860848a 100644 --- a/seleniumJSEnv/src/main/scala/org/scalajs/jsenv/selenium/Chrome.scala +++ b/seleniumJSEnv/src/main/scala/org/scalajs/jsenv/selenium/Chrome.scala @@ -1,23 +1,33 @@ package org.scalajs.jsenv.selenium -import org.openqa.selenium.chrome.ChromeDriverService +import org.openqa.selenium.chrome.{ChromeDriverService, ChromeOptions} import org.openqa.selenium.remote._ -object Chrome extends SeleniumBrowser { +import scala.language.implicitConversions + +object Chrome { + def apply(): Chrome = new Chrome(new ChromeOptions) + + @deprecated("Use Chrome() instead.", "0.1.3") + implicit def useAsConfig(self: Chrome.type): Chrome = apply() +} + +class Chrome private (chromeOptions: ChromeOptions) extends SeleniumBrowser { + def name: String = "Chrome" def newDriver: BrowserDriver = new ChromeDriver + def withChromeOptions(chromeOptions: ChromeOptions): Chrome = new Chrome(chromeOptions) private class ChromeDriver extends BrowserDriver { protected def newDriver(): RemoteWebDriver = { - val caps = DesiredCapabilities.chrome() val service = { /* Activate the silent ChromeDriverService silent mode, * see ChromeDriverService.createDefaultService */ new ChromeDriverService.Builder().withSilent(true).usingAnyFreePort.build } - new org.openqa.selenium.chrome.ChromeDriver(service, caps) + new org.openqa.selenium.chrome.ChromeDriver(service, chromeOptions) } } } diff --git a/seleniumJSEnv/src/main/scala/org/scalajs/jsenv/selenium/Firefox.scala b/seleniumJSEnv/src/main/scala/org/scalajs/jsenv/selenium/Firefox.scala index ef8ab94..ec4e5dc 100644 --- a/seleniumJSEnv/src/main/scala/org/scalajs/jsenv/selenium/Firefox.scala +++ b/seleniumJSEnv/src/main/scala/org/scalajs/jsenv/selenium/Firefox.scala @@ -2,7 +2,16 @@ package org.scalajs.jsenv.selenium import org.openqa.selenium.remote.RemoteWebDriver -object Firefox extends SeleniumBrowser { +import scala.language.implicitConversions + +object Firefox { + def apply(): Firefox = new Firefox + + @deprecated("Use Firefox() instead.", "0.1.3") + implicit def useAsConfig(self: Firefox.type): Firefox = apply() +} + +class Firefox private () extends SeleniumBrowser { def name: String = "Firefox" def newDriver: BrowserDriver = new FirefoxDriver