All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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