{"ns":"drill-grounds","title":"Drill Grounds","version":"1.1","summary":"Drill Grounds is a set of classic web practice pages: an index of twelve examples including form authentication with flash messages, add/remove elements, checkboxes, a bare dropdown, inputs, key presses, JavaScript dialogs, multiple windows, hovers, a sortable table, dynamic loading and HTTP status codes. Markup is deliberately plain so controls can be driven directly.","problem":"Anyone learning or validating web automation needs small, predictable pages with well-known behaviours: waits, native dialogs, new tabs, sorting, sessions and flash messages.","personas":[{"name":"Automation learner","need":"Practise each interaction type on a page with a single, obvious behaviour."},{"name":"Tool evaluator","need":"Check that a tool handles waits, dialogs, windows, hover and session flows correctly."}],"goals":["Every example behaves exactly as its heading and instructions say.","Sessions and flash messages follow the classic one-shot pattern.","Timed elements appear after a delay of about 2.5 seconds."],"features":[{"id":"IDX","title":"Index","summary":"Landing page linking every example.","reqs":[{"id":"FR-IDX-01","weight":"Must","text":"The index lists all twelve examples and each link opens its page with a 200 response.","accept":["Title \"Drill Grounds\"; heading \"Welcome to drill-grounds\"; sub-heading \"Available Examples\"","Links: Add/Remove Elements, Checkboxes, Dropdown, Dynamic Loading, Form Authentication, Hovers, Inputs, JavaScript Alerts, Key Presses, Multiple Windows, Status Codes, Sortable Data Tables","Footer \"Powered by Drill Grounds\""]}]},{"id":"AUT","title":"Form authentication","summary":"Login page, secure area and flash messages.","reqs":[{"id":"FR-AUT-01","weight":"Must","text":"Valid credentials open the secure area with a green, dismissible flash.","accept":["Login page heading \"Login Page\" with Username, Password and \"Login\"","URL /drill-grounds/secure; flash \"You logged into a secure area!\"; heading \"Secure Area\"; button \"Logout\"","The flash close button (x) removes the flash"]},{"id":"FR-AUT-02","weight":"Must","text":"Invalid credentials are refused with a red flash; the username is checked first (case-sensitive), then the password.","accept":["Unknown, differently cased or empty username: \"Your username is invalid!\"","Right username with a wrong password: \"Your password is invalid!\"","The login page is shown again"]},{"id":"FR-AUT-03","weight":"Must","text":"The secure area requires a session; anonymous access is redirected to the login page with a flash shown only once.","accept":["Flash \"You must login to view the secure area!\"","Reloading the login page shows no flash"]},{"id":"FR-AUT-04","weight":"Should","text":"Logout ends the session, returns to the login page and the secure area is protected again.","accept":["Flash \"You logged out of the secure area!\"","Opening /drill-grounds/secure redirects to login with \"You must login to view the secure area!\""]}]},{"id":"CTL","title":"Native controls","summary":"Add/remove, checkboxes, dropdown, inputs and keys.","reqs":[{"id":"FR-CTL-01","weight":"Should","text":"Each click of \"Add Element\" adds a \"Delete\" button (class added-manually); each Delete removes itself.","accept":["3 clicks give three buttons; deleting one leaves two; deleting all leaves none and \"Add Element\" still works"]},{"id":"FR-CTL-02","weight":"Should","text":"Two checkboxes start unchecked and checked and toggle on click; state is not persisted.","accept":["\"checkbox 1\" unchecked, \"checkbox 2\" checked; after clicking both the reverse; reload restores the start state"]},{"id":"FR-CTL-03","weight":"Should","text":"The dropdown is a bare select (id \"dropdown\", no label or ARIA) with a disabled placeholder; choosing an option sets its value.","accept":["Heading \"Dropdown List\"; placeholder \"Please select an option\" is disabled and cannot be re-selected","\"Option 2\" gives value \"2\""]},{"id":"FR-CTL-04","weight":"Could","text":"The number field accepts digits, signs and arrow keys only.","accept":["12 then ArrowUp twice = 14","-3 then ArrowDown = -4","Typing \"abc\" leaves the field empty"]},{"id":"FR-CTL-05","weight":"Should","text":"The key-press page reports the last key pressed in upper case.","accept":["\"a\" gives \"You entered: A\"; Enter gives \"You entered: ENTER\"; Escape gives \"You entered: ESCAPE\"; Shift gives \"You entered: SHIFT\""]}]},{"id":"BRW","title":"Browser features","summary":"Dialogs, windows and hovers.","reqs":[{"id":"FR-BRW-01","weight":"Must","text":"Each JavaScript alert, confirm and prompt shows its native dialog and reports the outcome in Result.","accept":["Alert (text \"I am a JS Alert\"): \"You successfully clicked an alert\"","Confirm: dismiss \"You clicked: Cancel\"; accept \"You clicked: Ok\"","Prompt: typing hello gives \"You entered: hello\"; dismiss gives \"You entered: null\""]},{"id":"FR-BRW-02","weight":"Should","text":"\"Click Here\" opens a second tab that can be switched to and closed without affecting the first.","accept":["New tab /drill-grounds/windows/new titled \"New Window\" with heading \"New Window\"","Original tab still shows \"Opening a new window\""]},{"id":"FR-BRW-03","weight":"Could","text":"Each of three avatars shows its caption and a \"View profile\" link only while hovered.","accept":["Second avatar caption \"name: user2\"; other captions hidden; hidden again after moving away"]},{"id":"FR-BRW-04","weight":"Could","text":"Each \"View profile\" link opens a profile page.","accept":["/drill-grounds/users/1 responds 200"]}]},{"id":"TBL","title":"Sortable table","summary":"Header sorting with direction toggle.","reqs":[{"id":"FR-TBL-01","weight":"Should","text":"Clicking a header sorts the rows and a second click reverses the order; text sorts alphabetically and Due sorts numerically.","accept":["Table #table1 columns Last Name, First Name, Email, Due, Web Site, Action; initial rows Smith, Bach, Doe, Conway","Last Name ascending: Bach, Conway, Doe, Smith; descending: Smith, Doe, Conway, Bach","Due ascending: $50.00, $50.00, $51.00, $100.00; descending starts with Doe $100.00 then Bach $51.00"]}]},{"id":"DYN","title":"Dynamic loading","summary":"Waits for delayed content.","reqs":[{"id":"FR-DYN-01","weight":"Should","text":"Example 1 contains a hidden element that becomes visible after the loader.","accept":["Heading \"Example 1: Element on page that is hidden\"; #finish exists but hidden","Start shows \"Loading... \" and hides Start; after about 2.5 s \"Hello World!\" is visible and the loader hidden"]},{"id":"FR-DYN-02","weight":"Should","text":"Example 2 renders its element only after the loader finishes.","accept":["Heading \"Example 2: Element rendered after the fact\"; no #finish before Start","\"Hello World!\" appears after about 2.5 s"]},{"id":"FR-DYN-03","weight":"Could","text":"An example number that does not exist responds 404.","accept":["/drill-grounds/dynamic_loading/3 returns HTTP 404"]}]},{"id":"STA","title":"Status codes","summary":"Pages returning chosen HTTP statuses.","reqs":[{"id":"FR-STA-01","weight":"Should","text":"Each status link returns the status it names with a body naming it and a link back; unsupported codes return 404.","accept":["Links 200, 301, 404, 500 return HTTP 200, 301, 404, 500","Body \"This page returned a <code> status code.\"","/drill-grounds/status_codes/418 returns 404 and the body says 404"]}]}],"nfr":[],"glossary":[{"term":"Flash","meaning":"A one-shot message shown after a redirect and gone on the next page view."}],"outOfScope":["Visual styling","Examples not listed on the index"]}