packages feed

webdriver-w3c-0.0.3: app/ReplDemo.hs

{-# LANGUAGE OverloadedStrings #-}
module Main where

import Control.Monad.IO.Class
import Data.List (isInfixOf)
import Data.Text (Text)

import Web.Api.WebDriver

{-
Utilities for demoing webdriver sessions. I mostly use this for testing
and development. To run an individual demo, first make sure your remote end
(chromedriver or geckodriver) is running on the correct port, then from ghci
say something like:

    withChromedriver normalChrome demoNewWindow

The executable runs all the demos, although this is less useful.
-}

main :: IO ()
main = do
  withChromedriver normalChrome demoNewWindow
  withChromedriver normalChrome demoGetComputedRole
  withChromedriver normalChrome demoGetComputedLabel

  withChromedriver headlessChrome demoPrintPage





withChromedriver :: Capabilities -> WebDriverT IO () -> IO ()
withChromedriver caps acts = do
  execWebDriverT chromeConfig $
    runIsolated_ caps acts
  return ()

chromeConfig :: WebDriverConfig IO
chromeConfig = defaultWebDriverConfig
  { _environment = defaultWebDriverEnvironment
    { _env = defaultWDEnv
      { _remotePort = 9515
      , _responseFormat = SpecFormat
      }
    }
  }

normalChrome :: Capabilities
normalChrome = defaultChromeCapabilities

headlessChrome :: Capabilities
headlessChrome = defaultChromeCapabilities
  { _chromeOptions = Just $ defaultChromeOptions
    { _chromeArgs = Just ["--headless"]
    }
  }

consoleLogChrome :: Capabilities
consoleLogChrome = defaultChromeCapabilities
  { _chromeOptions = Just $ defaultChromeOptions
    { _chromeArgs = Just ["--user-data-dir=datadir", "--enable-logging", "--v=1"]
    }
  }



demoNewWindow :: WebDriverT IO ()
demoNewWindow = do
  -- open google.com in the current tab
  navigateTo "https://www.google.com"

  -- open a new tab; but do not switch to it
  (handle, _) <- newWindow TabContext

  -- switch to the new tab
  switchToWindow handle

  -- open bing.com in this tab
  navigateTo "https://www.bing.com"

  wait 5000000
  return ()



demoGetComputedRole :: WebDriverT IO ()
demoGetComputedRole = do
  -- open google.com
  navigateTo "https://www.google.com"

  -- get the ARIA role of whatever element is active on page load
  role <- getActiveElement >>= getComputedRole

  comment $ "Computed role is '" <> role <> "'"
  wait 5000000
  return ()



demoGetComputedLabel :: WebDriverT IO ()
demoGetComputedLabel = do
  -- open google.com
  navigateTo "https://www.google.com"

  -- get the ARIA label of whatever element is active on page load
  role <- getActiveElement >>= getComputedLabel

  comment $ "Computed label is '" <> role <> "'"
  wait 5000000
  return ()



demoPrintPage :: WebDriverT IO ()
demoPrintPage = do
  -- open google.com
  navigateTo "https://www.google.com"

  -- print
  pdf <- printPage defaultPrintOptions
  writeBase64EncodedPdf "testprint.pdf" pdf

  wait 5000000
  return ()



-- use this to demonstrate getting the JS console log
--   withChromedriver consoleLogChrome demoConsoleLogChrome
demoConsoleLogChrome :: WebDriverT IO ()
demoConsoleLogChrome = do
  -- open google.com
  navigateTo "https://www.google.com"

  executeScript "console.error('HEYOOOO')" []

  -- logLines <- fmap lines $ liftIO $ readFile "~/datadir/chrome_debug.log" -- you'll need to expand ~ here
  -- let lines = filter ("CONSOLE" `isInfixOf`) logLines
  -- liftIO $ print lines

  wait 5000000
  return ()