Skip to content

Commit a214cab

Browse files
committed
Migrate to Selenium 4, add Scala 3
1 parent 8dc20aa commit a214cab

File tree

10 files changed

+54
-34
lines changed

10 files changed

+54
-34
lines changed

.github/workflows/ci.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ jobs:
1212
strategy:
1313
fail-fast: false
1414
matrix:
15-
scalaversion: ["2.11.12", "2.12.10", "2.13.1"]
15+
scalaversion: ["2.12.20", "2.13.15", "3.3.4"]
1616
browser: ["chrome"]
1717
include:
18-
- scalaversion: "2.12.10"
18+
- scalaversion: "2.12.20"
1919
browser: "firefox"
2020
env:
2121
SJS_TEST_BROWSER: ${{ matrix.browser }}

build.sbt

+18-9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import org.openqa.selenium.firefox.FirefoxOptions
2+
import org.openqa.selenium.firefox.FirefoxDriver
13
import sbt.Keys._
24

35
import org.scalajs.sbtplugin.ScalaJSCrossVersion
@@ -7,17 +9,23 @@ import org.openqa.selenium.Capabilities
79
import org.scalajs.jsenv.selenium.SeleniumJSEnv
810
import org.scalajs.jsenv.selenium.TestCapabilities
911

10-
val previousVersion: Option[String] = Some("1.1.1")
12+
// we're breaking bincompat with the bump to selenium 4
13+
val previousVersion: Option[String] = None
1114

1215
val newScalaBinaryVersionsInThisRelease: Set[String] =
1316
Set()
1417

1518
val commonSettings: Seq[Setting[_]] = Seq(
1619
version := "1.1.2-SNAPSHOT",
1720
organization := "org.scala-js",
18-
scalaVersion := "2.11.12",
19-
crossScalaVersions := Seq("2.11.12", "2.12.10", "2.13.1"),
20-
scalacOptions ++= Seq("-deprecation", "-feature", "-Xfatal-warnings"),
21+
scalaVersion := "2.12.20",
22+
crossScalaVersions := Seq("2.12.10", "2.13.15", "3.3.4"),
23+
scalacOptions ++= Seq(
24+
"-deprecation",
25+
"-feature",
26+
"-Xfatal-warnings",
27+
"-Wconf:msg=constructor URL in class URL is deprecated:s",
28+
),
2129

2230
homepage := Some(url("http://scala-js.org/")),
2331
licenses += ("BSD New",
@@ -60,7 +68,7 @@ val jsEnvCapabilities = settingKey[org.openqa.selenium.Capabilities](
6068

6169
val testSettings: Seq[Setting[_]] = commonSettings ++ Seq(
6270
jsEnvCapabilities := TestCapabilities.fromEnv,
63-
jsEnv := new SeleniumJSEnv(jsEnvCapabilities.value),
71+
jsEnv := new SeleniumJSEnv(jsEnvCapabilities.value, SeleniumJSEnv.Config().withDriverFactory(caps => new FirefoxDriver(new FirefoxOptions(caps)))),
6472
scalaJSUseMainModuleInitializer := true
6573
)
6674

@@ -77,10 +85,10 @@ lazy val seleniumJSEnv: Project = project.
7785
* It pulls in "closure-compiler-java-6" which in turn bundles some old
7886
* guava stuff which in turn makes selenium fail.
7987
*/
80-
"org.seleniumhq.selenium" % "selenium-server" % "3.141.59",
81-
"org.scala-js" %% "scalajs-js-envs" % "1.1.1",
88+
"org.seleniumhq.selenium" % "selenium-java" % "4.25.0",
89+
("org.scala-js" %% "scalajs-js-envs" % "1.1.1") cross CrossVersion.for3Use2_13,
8290
"com.google.jimfs" % "jimfs" % "1.1",
83-
"org.scala-js" %% "scalajs-js-envs-test-kit" % "1.1.1" % "test",
91+
("org.scala-js" %% "scalajs-js-envs-test-kit" % "1.1.1" % "test") cross CrossVersion.for3Use2_13,
8492
"com.novocode" % "junit-interface" % "0.11" % "test"
8593
),
8694

@@ -117,7 +125,7 @@ lazy val seleniumJSEnv: Project = project.
117125
pomIncludeRepository := { _ => false },
118126

119127
// The chrome driver seems to not deal with parallelism very well (#47).
120-
parallelExecution in Test := false
128+
(Test / parallelExecution) := false
121129
)
122130

123131
lazy val seleniumJSEnvTest: Project = project.
@@ -135,6 +143,7 @@ lazy val seleniumJSHttpEnvTest: Project = project.
135143
jsEnvCapabilities.value,
136144
SeleniumJSEnv.Config()
137145
.withMaterializeInServer("tmp", "http://localhost:8080/tmp/")
146+
.withDriverFactory((caps) => new FirefoxDriver(new FirefoxOptions(caps)))
138147
)
139148
},
140149
scalaJSLinkerConfig ~= { _.withModuleKind(ModuleKind.ESModule) }

project/build.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
sbt.version=1.2.8
1+
sbt.version=1.10.2

project/build.sbt

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.2.0")
1+
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.17.0")
22

3-
addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.1.18")
3+
addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "1.1.4")
44

55
addSbtPlugin("org.scalastyle" % "scalastyle-sbt-plugin" % "1.0.0")
66

@@ -9,7 +9,7 @@ addSbtPlugin("org.scalastyle" % "scalastyle-sbt-plugin" % "1.0.0")
99
* guava stuff which in turn makes selenium fail.
1010
*/
1111
libraryDependencies ~=
12-
("org.seleniumhq.selenium" % "selenium-server" % "3.141.59" +: _)
12+
("org.seleniumhq.selenium" % "selenium-java" % "4.25.0" +: _)
1313

1414
unmanagedSourceDirectories in Compile ++= {
1515
val root = baseDirectory.value.getParentFile

seleniumJSEnv/src/main/scala/org/scalajs/jsenv/selenium/SeleniumJSEnv.scala

+12-7
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
package org.scalajs.jsenv.selenium
22

3-
import org.openqa.selenium._
4-
import org.openqa.selenium.remote.DesiredCapabilities
5-
import org.openqa.selenium.remote.server._
63

74
import org.scalajs.jsenv._
85

96
import java.net.URL
107
import java.nio.file.{Path, Paths}
8+
import org.openqa.selenium.Capabilities
9+
import org.openqa.selenium.remote.DesiredCapabilities
10+
import org.openqa.selenium.WebDriver
11+
import org.openqa.selenium.JavascriptExecutor
12+
import org.openqa.selenium.Platform
1113

1214
final class SeleniumJSEnv(capabilities: Capabilities, config: SeleniumJSEnv.Config) extends JSEnv {
15+
1316
def this(capabilities: Capabilities) =
1417
this(capabilities, SeleniumJSEnv.Config())
1518

1619
private val augmentedCapabilities = {
1720
val x = new DesiredCapabilities(capabilities)
18-
x.setJavascriptEnabled(true)
21+
// x.setJavascriptEnabled(true)
1922
x
2023
}
2124

@@ -29,7 +32,7 @@ final class SeleniumJSEnv(capabilities: Capabilities, config: SeleniumJSEnv.Conf
2932

3033
private def newDriver() = {
3134
val driver: WebDriver =
32-
config.driverFactory.newInstance(augmentedCapabilities)
35+
config.driverFactory(augmentedCapabilities)
3336

3437
/* The first `asInstanceOf`s are a fail-fast for the second one, which
3538
* scalac partially erases, so that we're sure right now that the last
@@ -46,6 +49,7 @@ final class SeleniumJSEnv(capabilities: Capabilities, config: SeleniumJSEnv.Conf
4649
}
4750

4851
object SeleniumJSEnv {
52+
4953
final class Config private (
5054
val driverFactory: DriverFactory,
5155
val keepAlive: Boolean,
@@ -56,7 +60,8 @@ object SeleniumJSEnv {
5660
private def this() = this(
5761
keepAlive = false,
5862
materialization = Config.Materialization.Temp,
59-
driverFactory = new DefaultDriverFactory(Platform.getCurrent()))
63+
driverFactory = caps => sys.error("No driver factory configured")
64+
)
6065

6166
/** Materializes purely virtual files into a temp directory.
6267
*
@@ -128,7 +133,7 @@ object SeleniumJSEnv {
128133

129134
abstract class Materialization private ()
130135
object Materialization {
131-
final case object Temp extends Materialization
136+
case object Temp extends Materialization
132137
final case class Server(contentDir: Path, webRoot: URL) extends Materialization {
133138
require(webRoot.getPath().endsWith("/"), "webRoot must end with a slash (/)")
134139
}

seleniumJSEnv/src/main/scala/org/scalajs/jsenv/selenium/SeleniumRun.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ private sealed class SeleniumRun(
2424

2525
protected val intf = "this.scalajsSeleniumInternalInterface"
2626

27-
private[this] implicit val ec =
27+
private[this] implicit val ec: ExecutionContext =
2828
ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor())
2929

3030
private val handler = Future {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.scalajs.jsenv
2+
3+
import org.openqa.selenium.WebDriver
4+
import org.openqa.selenium.Capabilities
5+
6+
package object selenium {
7+
type DriverFactory = Capabilities => WebDriver
8+
}

seleniumJSEnv/src/test/scala/org/scalajs/jsenv/selenium/KeepAliveTest.scala

+4-8
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import java.net.URL
77

88
import org.openqa.selenium._
99
import org.openqa.selenium.remote.DesiredCapabilities
10-
import org.openqa.selenium.remote.server._
1110

1211
import org.junit._
1312
import org.junit.Assert._
@@ -56,14 +55,11 @@ class KeepAliveTest {
5655
private final class MockInjector(driver: WebDriver) extends DriverFactory {
5756
var used = false
5857

59-
def newInstance(caps: Capabilities): WebDriver = {
60-
require(!used)
61-
used = true
62-
driver
58+
def apply(caps: Capabilities): WebDriver = {
59+
require(!used)
60+
used = true
61+
driver
6362
}
64-
65-
def hasMappingFor(caps: Capabilities): Boolean = true
66-
def registerDriverProvider(p: DriverProvider): Unit = ???
6763
}
6864

6965
private def setup(keepAlive: Boolean) = {

seleniumJSEnv/src/test/scala/org/scalajs/jsenv/selenium/SeleniumJSEnvSuite.scala seleniumJSEnv/src/test/scala/org/scalajs/jsenv/selenium/SeleniumJSSuite.scala

+3-1
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ import org.junit.runner.Runner
99
import org.junit.runners.Suite
1010
import org.junit.runner.manipulation.Filter
1111
import org.junit.runner.Description
12+
import org.openqa.selenium.firefox.FirefoxDriver
13+
import org.openqa.selenium.firefox.FirefoxOptions
1214

1315
@RunWith(classOf[JSEnvSuiteRunner])
1416
class SeleniumJSSuite extends JSEnvSuite(
15-
JSEnvSuiteConfig(new SeleniumJSEnv(TestCapabilities.fromEnv))
17+
JSEnvSuiteConfig(new SeleniumJSEnv(TestCapabilities.fromEnv, SeleniumJSEnv.Config().withDriverFactory(caps => new FirefoxDriver(new FirefoxOptions(caps)))))
1618
)

seleniumJSEnv/src/test/scala/org/scalajs/jsenv/selenium/TestCapabilities.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ object TestCapabilities {
1313
def fromEnv: Capabilities = nameFromEnv match {
1414
case "firefox" =>
1515
new FirefoxOptions()
16-
.setHeadless(true)
16+
.addArguments("--headless")
1717
.setLogLevel(FirefoxDriverLogLevel.ERROR)
1818

1919
case "chrome" =>
2020
new ChromeOptions()
21-
.setHeadless(true)
21+
.addArguments("--headless")
2222

2323
case name =>
2424
throw new IllegalArgumentException(s"Unknown browser $name")

0 commit comments

Comments
 (0)