packages feed

webdriver-0.13.0.0: src/Test/WebDriver/Commands/Logs.hs

module Test.WebDriver.Commands.Logs (
  -- * Main log retrieval functions
  withRecordLogsViaBiDi
  , withRecordLogsViaBiDi'

  , getLogs

  -- * Driver-specific implementations
  -- , getChromeLogs
  -- , getFirefoxLogs
  -- , getSeleniumLogs
  -- , getSeleniumLogTypes

  -- * Types
  , LogType
  , LogEntry(..)
  , LogLevel(..)
  ) where

import GHC.Stack
import Test.WebDriver.Commands.Logs.BiDi
import Test.WebDriver.Commands.Logs.Chrome
import Test.WebDriver.Commands.Logs.Common
import Test.WebDriver.Commands.Logs.Firefox
import Test.WebDriver.Commands.Logs.Selenium
import Test.WebDriver.Types


-- | Retrieve logs of a specific type from the browser. The W3C spec doesn't
-- define how to do this natively, so we automatically detect the browser and
-- try to use an appropriate method:
--
-- * Chrome/Chromium: Chrome DevTools Protocol (CDP)
-- * Firefox: legacy log endpoint (/log)
-- * Selenium: legacy log endpoint (/log)
-- * Other browsers: returns empty list
--
-- Common log types: @browser@, @driver@, @performance@, @server@.
--
-- However, the modern way to do this is via 'withRecordLogsViaBiDi'.
getLogs :: (HasCallStack, WebDriver wd) => LogType -> wd [LogEntry]
getLogs logType = do
  Session { sessionDriver = Driver { _driverConfig = driverConfig } } <- getSession
  case detectBrowserFromDriver driverConfig of
    Just BrowserChrome -> getChromeLogs logType
    Just BrowserFirefox -> getFirefoxLogs logType
    Just BrowserSelenium -> getSeleniumLogs logType
    Nothing -> return [] -- Return empty for unsupported browsers