
com.github.pierrenodet.fs2.selenium.Driver.scala Maven / Gradle / Ivy
The newest version!
package com.github.pierrenodet.fs2.selenium
import java.net.URL
import cats.effect.{Resource, Sync}
import cats.implicits._
import org.openqa.selenium.chrome.{ChromeDriver, ChromeOptions}
import org.openqa.selenium.firefox.{FirefoxDriver, FirefoxOptions}
import org.openqa.selenium.{By, Capabilities, WebDriver}
import scala.collection.JavaConverters._
trait Driver[F[_]] {
val _webDriver: WebDriver
def get(url: String): F[Unit]
def get(url: URL): F[Unit] = get(url.toString)
def currentUrl: F[String]
def pageSource: F[String]
def title: F[String]
def windowHandle: F[String]
def windowHandles: F[Set[String]]
def findElement(by: By): F[scala.Option[Element[F]]]
def findElements(by: By): F[List[Element[F]]]
def manage: Option[F]
def navigate: Navigation[F]
def switchTo: Locator[F]
}
object Driver {
// @inline def apply[F[_]](implicit instance: Driver[F]): Driver[F] = instance
def apply[F[_]: Sync](acquire: () => F[WebDriver]): Resource[F, Driver[F]] = {
Resource
.make[F, Driver[F]](Sync[F].suspend {
acquire().map(impl.mkDriver[F])
})(
driver =>
Sync[F]
.delay {
driver._webDriver.close()
}
.handleErrorWith(_ => Sync[F].unit)
)
}
def apply[F[_]: Sync](capabilities: Capabilities): Resource[F, Driver[F]] =
apply(() => impl.create(capabilities))
object impl {
def create[F[_]: Sync](
capabilities: Capabilities
): F[WebDriver] =
Sync[F].delay(capabilities match {
case chromeOptions: ChromeOptions => new ChromeDriver(chromeOptions)
case firefoxOptions: FirefoxOptions => new FirefoxDriver(firefoxOptions)
})
def mkDriver[F[_]: Sync](webDriver: WebDriver): Driver[F] = {
new Driver[F] {
val _webDriver: WebDriver = webDriver
def get(url: String): F[Unit] =
Sync[F].delay(webDriver.get(url))
def currentUrl: F[String] = Sync[F].pure(webDriver.getCurrentUrl)
def pageSource: F[String] = Sync[F].pure(webDriver.getPageSource)
def title: F[String] = Sync[F].pure(webDriver.getTitle)
def windowHandle: F[String] = Sync[F].pure(webDriver.getWindowHandle)
def windowHandles: F[Set[String]] =
Sync[F].pure(webDriver.getWindowHandles.asScala.toSet)
def findElement(by: By): F[scala.Option[Element[F]]] =
Sync[F].delay(Either.catchOnly[Exception](Element[F](webDriver.findElement(by))).toOption)
def findElements(by: By): F[List[Element[F]]] =
Sync[F].delay(
webDriver.findElements(by).asScala.toList.map(Element[F])
)
def manage: Option[F] = Option[F](webDriver.manage())
def navigate: Navigation[F] = Navigation[F](webDriver.navigate())
def switchTo: Locator[F] = Locator[F](webDriver.switchTo())
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy