尝试在REPL会话中使用Haskell中的Selenium(带webdriver
包)。为了开始我的运行:
startup :: IO ()
startup = do
runSession chromeConfig $ do
openPage "http://www.google.com"
新的Chrome浏览器打开,导航到Google,将其留在那里并完成startup
功能,Chrome浏览器仍处于打开状态(就像我需要的那样)。
现在,我想编写简单的脚本与Google页面进行交互,并从REPL运行它们。如何重用已打开的现有会话/ Chrome浏览器?
如果我再次尝试使用runSession,它会打开一个新的浏览器(正如文档所说)。如果我尝试使用runWD
,它需要一个会话作为第一个参数,我还没有。
有一个sessions :: WebDriver wd => wd [(SessionId, Capabilities)]
值,但要使用它,我必须在runWD
内,这需要一个会话!此外,它返回SessionID
,我看不到任何将其转换为WDSession
的函数。
我在这里转圈,任何帮助表示赞赏。我不确定为什么这么复杂,是因为Selenium还是Haskell?
答案 0 :(得分:4)
WD
monad是MonadIO
的实例,这意味着您可以使用liftIO
将WebDriver操作与IO操作交错。这允许您读取和写入控制台。我们的想法是在runSession
的一次调用中完成所有工作。
main = runSession chromeConfig $ do
openPage "http://www.google.com"
liftIO $ putStrLn "Enter your search term"
searchTerm <- liftIO getLine
input <- findElem "#lst-ib"
sendKeys input searchTerm
submit input
答案 1 :(得分:2)
我之前从未听说过这个库,但现在开始讨论,我看到runSession
似乎表明它会在给定配置的情况下创建一个新会话并运行WD
动作。
所以也许这样的事情可行:
do
session <- runSession defaultConfig getSession
runWD session (return ())
getSession
应该有效,因为WD
是WDSessionState
的一个实例。 runSession
明确表示会话未自动关闭,因此希望它可以重复使用。