{-# LANGUAGE OverloadedStrings #-} -- Requires hspec-webdriver 0.2.* and webdriver-angular 0.1.* import Test.Hspec.WebDriver import Test.WebDriver.Commands.Angular main :: IO () main = hspec $ do session "Todo list" $ using Firefox $ do it "opens the page" $ runWD $ do openPage "http://localhost:3000" -- This will wait until angular has finished rendering the page. -- The CSS selector references the element which contains ng-app, in this -- example the div directly below body. waitForAngular "body > div" `shouldReturn` True it "should find the initial todo" $ runWD $ do -- Check the initial text binding <- findNg $ ByBinding "{{todos.length}}" binding `shouldHaveText` "1 of 2 remaining [" it "should add a todo" $ runWD $ do -- Add a new todo txt <- findNg $ ByModel "todoText" sendKeys "My todo" txt btn <- findElem $ ByCSS "input.btn-primary" click btn -- Check it updated things properly binding <- findNg $ ByBinding "{{todos.length}}" binding `shouldHaveText` "2 of 3 remaining [" it "should find the new todo by repeaters" $ runWD $ do new <- findRepeater $ ByRow "todo in todos" 2 new `shouldBeTag` "li" new `shouldHaveText` "My todo" [r1, r2, r3] <- findRepeaters $ ByRows "todo in todos" r1 `shouldBeTag` "li" r2 `shouldBeTag` "li" r3 `shouldBeTag` "li" r1 `shouldHaveText` "learn angular" r2 `shouldHaveText` "integrate angular with your yesod app" r3 `shouldHaveText` "My todo" -- Note that if you try out the ByColumn repeaters it won't work because of -- https://github.com/angular/angular.js/issues/4383 (see also -- https://github.com/angular/protractor/issues/158) because the todo list uses -- bindings in the class element. If you remove the class binding from the span, -- the ByColumn repeaters do start working.