我正在尝试使用webdriver
和polysemy
在 Haskell 中构建一个自动化功能测试套件。我已经定义了适当的效果并将它们解释为 webdriver WD monad,但现在我被卡住了。
我有一个类型的值,我的自定义功能Member BrowserMaster r => Sem r ()
在哪里。BrowserMaster
这是口译员:
runBrowserMaster :: Members [Embed WD.WD, Embed IO] r => Sem (BrowserMaster ': r) a -> Sem r a
runBrowserMaster = interpret $ \case
ClickElement bmSelector ->
let action = (WD.findElem (bmSelectoToSelector bmSelector) >>= WD.click :: WD.WD ())
in embed action
{- ... -}
现在我想知道如何将Embed WD.WD
效果转换为Embed IO
,所以我最终只有一个。
我试图制作一个口译员:
runWebDriver :: Member (Embed IO) r => Sem (Embed WD.WD ': r) a -> Sem r a
runWebDriver = interpret $
\a -> embed $ runSession chromeConfig . finallyClose $ do
setImplicitWait 60000
setWindowSize (1024, 768)
unEmbed a
(这里runSession chromeConfig . finallyClose
是一个WD a -> IO a
)
它确实有效,但它似乎为每个命令启动了一个新的浏览器会话,而不是只启动一次,在内部完成所有操作并关闭。
我有一种直觉,它必须与资源获取和释放有关,但我无法理解这一点,以便能够将它们放在一起。