webdriver-precore-0.2.0.0: test/BiDi/Demos/InputEventDemos.hs
module BiDi.Demos.InputEventDemos where
import BiDi.Actions (BiDiActions (..))
import BiDi.DemoUtils
import Data.Maybe (fromJust)
import IOUtils (DemoActions (..))
import TestData (uploadUrl)
import WebDriverPreCore.BiDi.Protocol
import Prelude hiding (log, putStrLn)
-- Helper function to create default pointer common properties
defaultPointerProps :: PointerCommonProperties
defaultPointerProps =
MkPointerCommonProperties
{ width = Nothing,
height = Nothing,
pressure = Nothing,
tangentialPressure = Nothing,
twist = Nothing,
altitudeAngle = Nothing,
azimuthAngle = Nothing
}
{-
Input Events - Implementation Status:
1. input.fileDialogOpened :: ✓ inputEventFileDialogOpened (parsing works)
Firefox/geckodriver closes WebSocket connection when file dialog opens in headless mode,
causing ConnectionClosed exception. Events are received and parsed correctly before disconnect.
See bugs: 1855044, 1855045
The demos below work for event parsing but Firefox crashes in headless mode when file dialog opens.
-}
-- >>> runDemo inputEventFileDialogOpened
inputEventFileDialogOpened :: BiDiDemo
inputEventFileDialogOpened =
demo "Input Events - File Dialog Opened (Single File)" action
where
action :: DemoActions -> BiDiActions -> IO ()
action utils@MkDemoActions {..} bidi@MkBiDiActions {..} = do
logTxt "Subscribe to FileDialogOpened event"
(fileDialogEventFired, waitFileDialogEventFired) <- timeLimitLog InputFileDialogOpened
subscribeInputFileDialogOpened fileDialogEventFired
(manyFileDialogEventFired, waitManyFileDialogEventFired) <- timeLimitLogMany InputFileDialogOpened
subscribeMany [InputFileDialogOpened] manyFileDialogEventFired
bc <- newWindowContext utils bidi
logTxt "Navigating to upload page"
url <- uploadUrl
browsingContextNavigate $ MkNavigate bc url Nothing
logTxt "Locating single file upload input"
uploadInput <-
browsingContextLocateNodes $
MkLocateNodes
{ context = bc,
locator = CSS {value = "#singleUpload"},
maxNodeCount = Nothing,
serializationOptions = Nothing,
startNodes = Nothing
}
logShow "Upload input element" uploadInput
let MkLocateNodesResult nodes = uploadInput
uploadInputId :: SharedId
uploadInputId = case nodes of
[input] -> fromJust input.sharedId
_ -> error "Failed to locate single file upload input"
logTxt "Clicking on file upload input to open file dialog"
inputPerformActions $
MkPerformActions
{ context = bc,
actions =
[ PointerSourceActions $
MkPointerSourceActions
{ pointerId = "mouse1",
pointer = Just $ MkPointer {pointerType = Just MousePointer},
pointerActions =
[ PointerMove
{ x = 0,
y = 0,
duration = Nothing,
origin =
Just $
ElementOrigin $
MkSharedReference
{ sharedId = uploadInputId,
handle = Nothing,
extensions = Nothing
},
pointerCommonProperties = defaultPointerProps
},
PointerDown
{ button = 0,
pointerCommonProperties = defaultPointerProps
},
PointerUp
{ button = 0
}
]
}
]
}
logTxt "Waiting for file dialog opened events..."
sequence_
[ waitFileDialogEventFired,
waitManyFileDialogEventFired
]