使用Haskell和webdriver重用现有的Selenium会话

时间:2017-02-24 18:50:39

标签: selenium haskell selenium-webdriver webdriver

尝试在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?

2 个答案:

答案 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应该有效,因为WDWDSessionState的一个实例。 runSession明确表示会话未自动关闭,因此希望它可以重复使用。