使用Haskell和webdriver重用现有的Selenium会话
尝试在REPL会话中使用来自Haskell的Selenium(带有使用Haskell和webdriver重用现有的Selenium会话,selenium,haskell,selenium-webdriver,webdriver,Selenium,Haskell,Selenium Webdriver,Webdriver,尝试在REPL会话中使用来自Haskell的Selenium(带有webdriverpackage)。首先,我运行以下命令: startup :: IO () startup = do runSession chromeConfig $ do openPage "http://www.google.com" 新的Chrome浏览器打开,导航到谷歌,将其留在那里,启动功能完成,Chrome浏览器仍然打开(就像我需要它一样) 现在我想写一些简单的脚本来与Google页面交互,并从REP
webdriver
package)。首先,我运行以下命令:
startup :: IO ()
startup = do
runSession chromeConfig $ do
openPage "http://www.google.com"
新的Chrome浏览器打开,导航到谷歌,将其留在那里,启动功能完成,Chrome浏览器仍然打开(就像我需要它一样)
现在我想写一些简单的脚本来与Google页面交互,并从REPL运行它们。如何重用已打开的现有会话/浏览器
如果我再次尝试runSession,它会打开一个新的浏览器(如文档所述)。如果我尝试使用runWD
,它需要一个会话作为第一个参数,我还没有这个参数
有一个sessions::WebDriver wd=>wd[(SessionId,Capabilities)]
值,但要使用它,我必须在runWD
中,这需要一个会话!此外,它返回一个SessionID
,我没有看到任何函数将其转换为WDSession
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
我在这里兜圈子,谢谢你的帮助。我不知道为什么会这么复杂,是因为Selenium还是Haskell?我以前从未听说过这个库,但现在翻看一下,我看到
运行会话
似乎表明它将在给定配置的情况下创建一个新会话,并运行WD
操作
因此,也许类似的方法可以奏效:
do
session <- runSession defaultConfig getSession
runWD session (return ())
do
sessionWD
monad是的一个实例,这意味着您可以使用将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
main=runSession chromeConfig$do
openPage“http://www.google.com"
liftIO$putStrLn“输入您的搜索条件”
searchTerm感谢您的回答,但我正在明确寻找一种解决方案,该解决方案不需要在一个runSession
块中写入所有代码。我确实尝试过类似的方法,但在GHCi重新加载后仍无法生存。@kmelva您可以使用“外部存储”使会话在GHCi重新加载时保持不变。但也许最简单的方法是从预先确定的文件路径读取会话(可能有一个指向该文件的环境变量,以增加灵活性)。@kmelva为什么希望/需要它在重新加载过程中保持不变?这是为了方便开发,还是目标工作流的基本部分?查看WDSession
我认为唯一难以序列化的部分是管理器。我不熟悉@danidiaz提到的外国商店
——也许这是一个简单的方法让一些东西工作起来。