Skip to content

Commit cde9f1f

Browse files
committed
Move to Selenium 4
1 parent 8dc20aa commit cde9f1f

File tree

8 files changed

+56
-60
lines changed

8 files changed

+56
-60
lines changed

.github/workflows/ci.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
strategy:
1313
fail-fast: false
1414
matrix:
15-
scalaversion: ["2.11.12", "2.12.10", "2.13.1"]
15+
scalaversion: ["2.12.10", "2.13.1"]
1616
browser: ["chrome"]
1717
include:
1818
- scalaversion: "2.12.10"
@@ -29,10 +29,10 @@ jobs:
2929
run: >
3030
sbt "++${{ matrix.scalaversion }}"
3131
seleniumJSEnv/scalastyle
32-
seleniumJSEnv/test:scalastyle
32+
seleniumJSEnv/Test/scalastyle
3333
seleniumJSEnvTest/scalastyle
34-
seleniumJSHttpEnvTest/test:scalastyle
35-
seleniumJSEnvTest/test:scalastyle
34+
seleniumJSHttpEnvTest/Test/scalastyle
35+
seleniumJSEnvTest/Test/scalastyle
3636
- name: MiMa
3737
run: sbt "++${{ matrix.scalaversion }}" seleniumJSEnv/mimaReportBinaryIssues
3838
- name: Unit tests

build.sbt

+8-11
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ import org.scalajs.sbtplugin.ScalaJSCrossVersion
55
import org.openqa.selenium.Capabilities
66

77
import org.scalajs.jsenv.selenium.SeleniumJSEnv
8-
import org.scalajs.jsenv.selenium.TestCapabilities
8+
import org.scalajs.jsenv.selenium.TestDrivers
99

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

1213
val newScalaBinaryVersionsInThisRelease: Set[String] =
1314
Set()
@@ -16,7 +17,7 @@ val commonSettings: Seq[Setting[_]] = Seq(
1617
version := "1.1.2-SNAPSHOT",
1718
organization := "org.scala-js",
1819
scalaVersion := "2.11.12",
19-
crossScalaVersions := Seq("2.11.12", "2.12.10", "2.13.1"),
20+
crossScalaVersions := Seq("2.12.10", "2.13.1"),
2021
scalacOptions ++= Seq("-deprecation", "-feature", "-Xfatal-warnings"),
2122

2223
homepage := Some(url("http://scala-js.org/")),
@@ -55,12 +56,8 @@ val previousArtifactSetting = Def.settings(
5556
}
5657
)
5758

58-
val jsEnvCapabilities = settingKey[org.openqa.selenium.Capabilities](
59-
"Capabilities of the SeleniumJSEnv")
60-
6159
val testSettings: Seq[Setting[_]] = commonSettings ++ Seq(
62-
jsEnvCapabilities := TestCapabilities.fromEnv,
63-
jsEnv := new SeleniumJSEnv(jsEnvCapabilities.value),
60+
jsEnv := new SeleniumJSEnv(TestDrivers.fromEnv),
6461
scalaJSUseMainModuleInitializer := true
6562
)
6663

@@ -77,7 +74,7 @@ lazy val seleniumJSEnv: Project = project.
7774
* It pulls in "closure-compiler-java-6" which in turn bundles some old
7875
* guava stuff which in turn makes selenium fail.
7976
*/
80-
"org.seleniumhq.selenium" % "selenium-server" % "3.141.59",
77+
"org.seleniumhq.selenium" % "selenium-java" % "4.25.0",
8178
"org.scala-js" %% "scalajs-js-envs" % "1.1.1",
8279
"com.google.jimfs" % "jimfs" % "1.1",
8380
"org.scala-js" %% "scalajs-js-envs-test-kit" % "1.1.1" % "test",
@@ -117,7 +114,7 @@ lazy val seleniumJSEnv: Project = project.
117114
pomIncludeRepository := { _ => false },
118115

119116
// The chrome driver seems to not deal with parallelism very well (#47).
120-
parallelExecution in Test := false
117+
(Test / parallelExecution) := false
121118
)
122119

123120
lazy val seleniumJSEnvTest: Project = project.
@@ -132,7 +129,7 @@ lazy val seleniumJSHttpEnvTest: Project = project.
132129
settings(
133130
jsEnv := {
134131
new SeleniumJSEnv(
135-
jsEnvCapabilities.value,
132+
TestDrivers.fromEnv,
136133
SeleniumJSEnv.Config()
137134
.withMaterializeInServer("tmp", "http://localhost:8080/tmp/")
138135
)

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

+6-6
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,14 +9,14 @@ 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

14-
unmanagedSourceDirectories in Compile ++= {
14+
Compile / unmanagedSourceDirectories ++= {
1515
val root = baseDirectory.value.getParentFile
1616
Seq(root / "seleniumJSEnv/src/main/scala")
1717
}
1818

19-
sources in Compile += {
19+
Compile / sources += {
2020
val root = baseDirectory.value.getParentFile
21-
root / "seleniumJSEnv/src/test/scala/org/scalajs/jsenv/selenium/TestCapabilities.scala"
21+
root / "seleniumJSEnv/src/test/scala/org/scalajs/jsenv/selenium/TestDrivers.scala"
2222
}

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

+16-23
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,20 @@
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
13+
import SeleniumJSEnv.DriverFactory
1114

12-
final class SeleniumJSEnv(capabilities: Capabilities, config: SeleniumJSEnv.Config) extends JSEnv {
13-
def this(capabilities: Capabilities) =
14-
this(capabilities, SeleniumJSEnv.Config())
15-
16-
private val augmentedCapabilities = {
17-
val x = new DesiredCapabilities(capabilities)
18-
x.setJavascriptEnabled(true)
19-
x
20-
}
15+
final class SeleniumJSEnv(driverFactory: DriverFactory, config: SeleniumJSEnv.Config) extends JSEnv {
2116

22-
val name: String = s"SeleniumJSEnv ($capabilities)"
17+
val name: String = s"SeleniumJSEnv ($config)"
2318

2419
def start(input: Seq[Input], runConfig: RunConfig): JSRun =
2520
SeleniumRun.start(newDriver _, input, config, runConfig)
@@ -29,7 +24,7 @@ final class SeleniumJSEnv(capabilities: Capabilities, config: SeleniumJSEnv.Conf
2924

3025
private def newDriver() = {
3126
val driver: WebDriver =
32-
config.driverFactory.newInstance(augmentedCapabilities)
27+
driverFactory()
3328

3429
/* The first `asInstanceOf`s are a fail-fast for the second one, which
3530
* scalac partially erases, so that we're sure right now that the last
@@ -43,20 +38,22 @@ final class SeleniumJSEnv(capabilities: Capabilities, config: SeleniumJSEnv.Conf
4338

4439
driver.asInstanceOf[WebDriver with JavascriptExecutor]
4540
}
41+
42+
def this(driverFactory: DriverFactory) = this(driverFactory, SeleniumJSEnv.Config())
4643
}
4744

4845
object SeleniumJSEnv {
46+
type DriverFactory = () => WebDriver
47+
4948
final class Config private (
50-
val driverFactory: DriverFactory,
5149
val keepAlive: Boolean,
5250
val materialization: Config.Materialization
5351
) {
5452
import Config.Materialization
5553

5654
private def this() = this(
5755
keepAlive = false,
58-
materialization = Config.Materialization.Temp,
59-
driverFactory = new DefaultDriverFactory(Platform.getCurrent()))
56+
materialization = Config.Materialization.Temp)
6057

6158
/** Materializes purely virtual files into a temp directory.
6259
*
@@ -113,13 +110,9 @@ object SeleniumJSEnv {
113110
def withKeepAlive(keepAlive: Boolean): Config =
114111
copy(keepAlive = keepAlive)
115112

116-
def withDriverFactory(driverFactory: DriverFactory): Config =
117-
copy(driverFactory = driverFactory)
118-
119113
private def copy(keepAlive: Boolean = keepAlive,
120-
materialization: Config.Materialization = materialization,
121-
driverFactory: DriverFactory = driverFactory) = {
122-
new Config(driverFactory, keepAlive, materialization)
114+
materialization: Config.Materialization = materialization) = {
115+
new Config(keepAlive, materialization)
123116
}
124117
}
125118

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

+3-7
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ 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._
1413

1514
import org.scalajs.jsenv._
15+
import org.scalajs.jsenv.selenium.SeleniumJSEnv.DriverFactory
1616

1717
class KeepAliveTest {
1818
private final class MockWebDriver extends WebDriver with JavascriptExecutor {
@@ -56,23 +56,19 @@ class KeepAliveTest {
5656
private final class MockInjector(driver: WebDriver) extends DriverFactory {
5757
var used = false
5858

59-
def newInstance(caps: Capabilities): WebDriver = {
59+
def apply(): WebDriver = {
6060
require(!used)
6161
used = true
6262
driver
6363
}
64-
65-
def hasMappingFor(caps: Capabilities): Boolean = true
66-
def registerDriverProvider(p: DriverProvider): Unit = ???
6764
}
6865

6966
private def setup(keepAlive: Boolean) = {
7067
val driver = new MockWebDriver
7168
val factory = new MockInjector(driver)
7269
val config = SeleniumJSEnv.Config()
73-
.withDriverFactory(factory)
7470
.withKeepAlive(keepAlive)
75-
val env = new SeleniumJSEnv(new DesiredCapabilities, config)
71+
val env = new SeleniumJSEnv(factory, config)
7672

7773
(driver, factory, env)
7874
}

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(TestDrivers.fromEnv))
1618
)

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

+15-7
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,28 @@ import org.openqa.selenium.firefox.{FirefoxOptions, FirefoxDriverLogLevel}
55
import org.openqa.selenium.chrome.ChromeOptions
66

77
import java.util.logging.{Logger, Level}
8+
import org.openqa.selenium.WebDriver
9+
import org.openqa.selenium.firefox.FirefoxDriver
10+
import org.openqa.selenium.chrome.ChromeDriver
11+
import org.scalajs.jsenv.selenium.SeleniumJSEnv.DriverFactory
812

9-
object TestCapabilities {
13+
object TestDrivers {
1014
// Lower the logging level for Selenium to avoid spam.
1115
Logger.getLogger("org.openqa.selenium").setLevel(Level.WARNING)
1216

13-
def fromEnv: Capabilities = nameFromEnv match {
17+
val fromEnv: DriverFactory = () => nameFromEnv match {
1418
case "firefox" =>
15-
new FirefoxOptions()
16-
.setHeadless(true)
17-
.setLogLevel(FirefoxDriverLogLevel.ERROR)
19+
new FirefoxDriver(
20+
new FirefoxOptions()
21+
.addArguments("--headless")
22+
.setLogLevel(FirefoxDriverLogLevel.ERROR)
23+
)
1824

1925
case "chrome" =>
20-
new ChromeOptions()
21-
.setHeadless(true)
26+
new ChromeDriver(
27+
new ChromeOptions()
28+
.addArguments("--headless")
29+
)
2230

2331
case name =>
2432
throw new IllegalArgumentException(s"Unknown browser $name")

0 commit comments

Comments
 (0)