Tôi đang làm việc thông qua gói selenium Haskell WebDriver để thử nghiệm, here.Một haskell "withSubprocess" xây dựng xung quanh một khối làm
Tôi có ví dụ này:
import Test.WebDriver
firefoxConfig :: WDConfig
firefoxConfig = defaultConfig
main :: IO()
main = runSession firefoxConfig $ do
openPage "http://google.com"
searchInput <- findElem (ByCSS "input[type='text']")
sendKeys "Hello, World!" searchInput
submit searchInput
closeSession
Các getting started section nói rõ rằng khách hàng selen đòi hỏi một máy chủ selen để giao tiếp với
java -jar selenium-server-standalone-*.jar
Nếu không có nó chạy, bạn có được điều này:
ghci λ> main
*** Exception: FailedConnectionException2 "127.0.0.1" 4444 False connect: does not exist (Connection refused)
Tôi muốn bọc toàn bộ tập lệnh thử nghiệm của mình vào một hàm khởi tạo t anh ta selenium-server, ghi lại pid của nó và giết (pid) sau khi tôi chạy phiên. Đó là, trong suốt thời gian của chính hiện tại của tôi, tôi muốn gọi java selenium-server vào sự tồn tại, nhưng tôi muốn nó dừng lại ngay khi cuộc gọi kết thúc.
Trong python Tôi muốn làm điều này bằng một cái gì đó giống như việc xác định một __enter__()
và một __exit__()
với thứ nước mắt xuống khác, subprocess.Popen
, ghi lại id, giết nó, sau đó gọi
with Browser() as b:
do_stuff
Tôi có cảm giác các thực thể runSession là loại điều tôi sẽ cần phải nhân rộng để bọc khởi động và teardown như thế này theo nghĩa là nó lấy khối firefoxConfig $ do
làm đối số và tôi cũng muốn làm điều đó.
Tuy nhiên, tôi không thể hoàn toàn hiểu được các loại từ thẩm vấn runSession, làm thế nào để làm cho loại điều:
ghci λ> :t runSession
runSession
:: Test.WebDriver.Config.WebDriverConfig conf =>
conf -> WD a -> IO a
Tôi nghĩ rằng tôi muốn được tìm kiếm một số loại withMonad tôi có thể áp dụng đối với này được áp dụng cho do
. Tôi nghĩ cú pháp sẽ là một số loại ...
import Test.WebDriver
import System.Process
firefoxConfig :: WDConfig
firefoxConfig = defaultConfig
withBrowser :: Monad a -> Monad a -- maybe this type?
withBrowser = do
r <- createProcess (proc "java -jar selenium-server-standalone-*.jar" [])
-- other magic here?
main :: IO()
main = withBrowser $ runSession firefoxConfig $ do
openPage "http://google.com"
searchInput <- findElem (ByCSS "input[type='text']")
sendKeys "Hello, World!" searchInput
submit searchInput
closeSession
Làm cách nào để đạt được điều này? Là monad phải không? Có một thành ngữ Haskell hay chiến lược nào cho điều này không?
Một 'Monad' không phải là một loại. Ngoài ra, hãy giữ nó đơn giản. 'createProcess 'và' runSession' đều sử dụng 'IO', vì vậy hãy ở trong' IO'. 'withBrowser :: IO a -> IO a'. – Zeta
Tại sao không sử dụng tập lệnh shell? – Ingo