예제 #1
0
파일: user.go 프로젝트: 18F/cg-dashboard
func (u User) LogoutOf(page *agouti.Page) {
	Expect(page.Navigate(u.testEnvVars.Hostname + "/v2/logout")).To(Succeed())
	/*
		Expect(page.Find("#logout-btn").Click()).To(Succeed())
		Eventually(Expect(page).To(HaveURL(u.testEnvVars.LoginURL + "login")))
	*/
}
예제 #2
0
파일: user.go 프로젝트: ArthurHlt/cg-deck
func (u User) LoginTo(page *agouti.Page) {
	Expect(page.Navigate(u.testEnvVars.Hostname)).To(Succeed())
	Expect(page.Find("#login-btn").Click()).To(Succeed())
	Expect(page).To(HaveURL(u.testEnvVars.LoginURL + "login"))
	Expect(page.FindByName("username").Fill(u.username)).To(Succeed())
	Expect(page.FindByName("password").Fill(u.password)).To(Succeed())
	Expect(page.FindByButton("Sign in").Click()).To(Succeed())
	Expect(page).To(HaveURL(u.testEnvVars.Hostname + "/#/dashboard"))
}
예제 #3
0
파일: user.go 프로젝트: 18F/cg-dashboard
func (u User) LoginTo(page *agouti.Page) {
	Expect(page.Navigate(u.testEnvVars.Hostname + "/#/")).To(Succeed())
	var loginLink = page.First(".test-login")
	Eventually(loginLink).Should(BeFound())
	Expect(loginLink.Click()).To(Succeed())
	Eventually(page).Should(HaveURL(u.testEnvVars.LoginURL + "login"))
	Expect(page.FindByName("username").Fill(u.username)).To(Succeed())
	Expect(page.FindByName("password").Fill(u.password)).To(Succeed())
	Expect(page.FindByButton("Sign in").Click()).To(Succeed())
	Eventually(page.FindByButton("Authorize").Click())
	Eventually(page).Should(HaveURL(u.testEnvVars.Hostname + "/#/dashboard"))
}
예제 #4
0
func TestSpec(t *testing.T) {
	Convey("UserRegister", t, func() {
		var agoutiDriver *agouti.WebDriver
		var page *agouti.Page

		session, _ := mgo.Dial("localhost")

		session.DB("TESTGoNuts").DropDatabase()

		agoutiDriver = agouti.PhantomJS()

		So(agoutiDriver.Start(), ShouldBeNil)

		log.Println("Starting")

		go StartMyApp(3232, "TESTGoNuts")

		var err error
		page, err = agoutiDriver.NewPage(agouti.Browser("chrome"))
		So(err, ShouldBeNil)

		Convey("User Registration page", func() {
			Convey("when the user registration is reached", func() {
				Convey("should see the page", func() {
					So(page.Navigate("http://localhost:3232"), ShouldBeNil)

					url, _ := page.URL()
					So(url, ShouldEqual, "http://localhost:3232/")
				})
			})
		})

		Reset(func() {
			So(page.Destroy(), ShouldBeNil)
			So(agoutiDriver.Stop(), ShouldBeNil)
		})
	})
}
예제 #5
0
		// Start a test server
		server, testEnvVars = startServer()

		// Create a fresh page to navigate.
		page = createPage()

		// Reset page
		resetPage(page, testEnvVars)

		// Create user
		user = StartUserSessionWith(testEnvVars)
	})

	It("should show the login form if accessing privileged dashboard page without first logining in.", func() {
		By("redirecting the user to the login form", func() {
			Expect(page.Navigate(testEnvVars.Hostname + "/#/")).To(Succeed())
			Expect(page.Find(".test-login")).Should(BeVisible())
		})

	})

	It("should manage user authentication", func() {
		By("directing the user to a landing page", func() {
			Expect(page.Navigate(testEnvVars.Hostname)).To(Succeed())
		})

		By("allowing the user to click the login button and redirected to fill out the login form and submit it", func() {
			user.LoginTo(page)
		})

		By("allowing the user to log out", func() {
예제 #6
0
func testPage(browserName string, newPage pageFunc) {
	Describe("page test for "+browserName, func() {
		var (
			page   *agouti.Page
			server *httptest.Server
		)

		BeforeEach(func() {
			server = httptest.NewServer(http.HandlerFunc(func(response http.ResponseWriter, request *http.Request) {
				html, _ := ioutil.ReadFile("test_page.html")
				response.Write(html)
			}))

			var err error
			page, err = newPage()
			Expect(err).NotTo(HaveOccurred())

			Expect(page.Size(640, 480)).To(Succeed())
			Expect(page.Navigate(server.URL)).To(Succeed())
		})

		AfterEach(func() {
			Expect(page.Destroy()).To(Succeed())
			server.Close()
		})

		It("should support retrieving page properties", func() {
			Expect(page).To(HaveTitle("Page Title"))
			Expect(page).To(HaveURL(server.URL + "/"))
			Expect(page.HTML()).To(ContainSubstring("<h1>Title</h1>"))
		})

		It("should support JavaScript", func() {
			By("waiting for page JavaScript to take effect", func() {
				Expect(page.Find("#some_element")).NotTo(HaveText("some text"))
				Eventually(page.Find("#some_element"), "4s").Should(HaveText("some text"))
				Consistently(page.Find("#some_element")).Should(HaveText("some text"))
			})

			// NOTE: disabled due to recent Firefox regression with passing args
			if browserName != "Firefox" {
				By("executing provided JavaScript", func() {
					arguments := map[string]interface{}{"elementID": "some_element"}
					var result string
					Expect(page.RunScript("return document.getElementById(elementID).innerHTML;", arguments, &result)).To(Succeed())
					Expect(result).To(Equal("some text"))
				})
			}
		})

		It("should support taking screenshots", func() {
			Expect(page.Screenshot(".test.screenshot.png")).To(Succeed())
			defer os.Remove(".test.screenshot.png")
			file, _ := os.Open(".test.screenshot.png")
			_, err := png.Decode(file)
			Expect(err).NotTo(HaveOccurred())
		})

		It("should support links and navigation", func() {
			By("clicking on a link", func() {
				Expect(page.FindByLink("Click Me").Click()).To(Succeed())
				Expect(page.URL()).To(ContainSubstring("#new_page"))
			})

			By("navigating through browser history", func() {
				Expect(page.Back()).To(Succeed())
				Expect(page.URL()).NotTo(ContainSubstring("#new_page"))
				Expect(page.Forward()).To(Succeed())
				Expect(page.URL()).To(ContainSubstring("#new_page"))
			})

			By("refreshing the page", func() {
				checkbox := page.Find("#some_checkbox")
				Expect(checkbox.Check()).To(Succeed())
				Expect(page.Refresh()).To(Succeed())
				Expect(checkbox).NotTo(BeSelected())
			})
		})

		// NOTE: browsers besides PhantomJS do not support JavaScript logs
		if browserName == "PhantomJS" {
			It("should support retrieving logs", func() {
				Eventually(page).Should(HaveLoggedInfo("some log"))
				Expect(page).NotTo(HaveLoggedError())
				Eventually(page, "4s").Should(HaveLoggedError("ReferenceError: Can't find variable: doesNotExist\n  (anonymous function)"))
			})
		}

		It("should support switching frames", func() {
			By("switching to an iframe", func() {
				Expect(page.Find("#frame").SwitchToFrame()).To(Succeed())
				Expect(page.Find("body")).To(MatchText("Example Domain"))
			})

			// NOTE: PhantomJS does not support Page.SwitchToParentFrame
			if browserName != "PhantomJS" {
				By("switching back to the default frame by referring to the parent frame", func() {
					Expect(page.SwitchToParentFrame()).To(Succeed())
					Expect(page.Find("body")).NotTo(MatchText("Example Domain"))
				})

				Expect(page.Find("#frame").SwitchToFrame()).To(Succeed())
			}

			By("switching back to the default frame by referring to the root frame", func() {
				Expect(page.SwitchToRootFrame()).To(Succeed())
				Expect(page.Find("body")).NotTo(MatchText("Example Domain"))
			})
		})

		It("should support switching windows", func() {
			Expect(page.Find("#new_window").Click()).To(Succeed())
			Expect(page).To(HaveWindowCount(2))

			By("switching windows", func() {
				Expect(page.SwitchToWindow("new window")).To(Succeed())
				Expect(page.Find("header")).NotTo(BeFound())
				Expect(page.NextWindow()).To(Succeed())
				Expect(page.Find("header")).To(BeFound())
			})

			By("closing windows", func() {
				Expect(page.CloseWindow()).To(Succeed())
				Expect(page).To(HaveWindowCount(1))
			})
		})

		// NOTE: PhantomJS does not support popup boxes
		if browserName != "PhantomJS" {
			It("should support popup boxes", func() {
				By("interacting with alert popups", func() {
					Expect(page.Find("#popup_alert").Click()).To(Succeed())
					Expect(page).To(HavePopupText("some alert"))
					Expect(page.ConfirmPopup()).To(Succeed())
				})

				By("interacting with confirm boxes", func() {
					var confirmed bool

					Expect(page.Find("#popup_confirm").Click()).To(Succeed())

					Expect(page.ConfirmPopup()).To(Succeed())
					Expect(page.RunScript("return confirmed;", nil, &confirmed)).To(Succeed())
					Expect(confirmed).To(BeTrue())

					Expect(page.Find("#popup_confirm").Click()).To(Succeed())

					Expect(page.CancelPopup()).To(Succeed())
					Expect(page.RunScript("return confirmed;", nil, &confirmed)).To(Succeed())
					Expect(confirmed).To(BeFalse())
				})

				By("interacting with prompt boxes", func() {
					var promptText string

					Expect(page.Find("#popup_prompt").Click()).To(Succeed())

					Expect(page.EnterPopupText("banana")).To(Succeed())
					Expect(page.ConfirmPopup()).To(Succeed())
					Expect(page.RunScript("return promptText;", nil, &promptText)).To(Succeed())
					Expect(promptText).To(Equal("banana"))
				})
			})
		}

		It("should support manipulating and retrieving cookies", func() {
			Expect(page.SetCookie(&http.Cookie{Name: "webdriver-test-cookie", Value: "webdriver value"})).To(Succeed())
			cookies, err := page.GetCookies()
			Expect(err).NotTo(HaveOccurred())
			cookieNames := []string{cookies[0].Name, cookies[1].Name}
			Expect(cookieNames).To(ConsistOf("webdriver-test-cookie", "browser-test-cookie"))
			Expect(page.DeleteCookie("browser-test-cookie")).To(Succeed())
			Expect(page.GetCookies()).To(HaveLen(1))
			Expect(page.ClearCookies()).To(Succeed())
			Expect(page.GetCookies()).To(HaveLen(0))
		})

		It("should support resetting the page", func() {
			Expect(page.SetCookie(&http.Cookie{Name: "webdriver-test-cookie", Value: "webdriver value"})).To(Succeed())
			Expect(page.GetCookies()).To(HaveLen(2))

			Expect(page.RunScript("localStorage.setItem('some-local-storage-key', 'some-local-storage-value');", nil, nil)).To(Succeed())
			var localStorageTest string
			Expect(page.RunScript("return localStorage.getItem('some-local-storage-key')", nil, &localStorageTest)).To(Succeed())
			Expect(localStorageTest).To(Equal("some-local-storage-value"))

			Expect(page.RunScript("sessionStorage.setItem('some-session-storage-key', 'some-session-storage-value');", nil, nil)).To(Succeed())
			var sessionStorageTest string
			Expect(page.RunScript("return sessionStorage.getItem('some-session-storage-key')", nil, &sessionStorageTest)).To(Succeed())
			Expect(sessionStorageTest).To(Equal("some-session-storage-value"))

			Expect(page.Find("#popup_alert").Click()).To(Succeed())

			Expect(page.Reset()).To(Succeed())

			By("navigating to about:blank", func() {
				Expect(page.URL()).To(Equal("about:blank"))
			})

			Expect(page.Navigate(server.URL)).To(Succeed())

			By("deleting all cookies for the current domain", func() {
				Expect(page.GetCookies()).To(HaveLen(1))
			})

			By("deleting local storage for the current domain", func() {
				var localStorageTest string
				Expect(page.RunScript("return localStorage.getItem('some-local-storage-key');", nil, &localStorageTest)).To(Succeed())
				Expect(localStorageTest).To(BeEmpty())
			})

			By("deleting session storage for the current domain", func() {
				var sessionStorageTest string
				Expect(page.RunScript("return sessionStorage.getItem('some-session-storage-key');", nil, &sessionStorageTest)).To(Succeed())
				Expect(sessionStorageTest).To(BeEmpty())
			})

			By("allowing reset to be called multiple times", func() {
				Expect(page.Reset()).To(Succeed())
				Expect(page.Reset()).To(Succeed())
				Expect(page.Navigate(server.URL)).To(Succeed())
			})
		})

		It("should support various mouse events", func() {
			checkbox := page.Find("#some_checkbox")

			By("moving from the disabled checkbox a regular checkbox", func() {
				disabledCheckbox := page.Find("#some_disabled_checkbox")
				Expect(disabledCheckbox.MouseToElement())
				Expect(page.MoveMouseBy(-24, 0)).To(Succeed())

				// NOTE: Firefox does not move the mouse by an offset correctly
				if browserName == "Firefox" {
					Expect(checkbox.MouseToElement())
				}
			})

			By("single clicking on a checkbox", func() {
				Expect(page.Click(agouti.SingleClick, agouti.LeftButton)).To(Succeed())
				Expect(checkbox).To(BeSelected())
			})

			By("holding and releasing a click on a checkbox", func() {
				Expect(page.Click(agouti.HoldClick, agouti.LeftButton)).To(Succeed())
				Expect(page.Click(agouti.ReleaseClick, agouti.LeftButton)).To(Succeed())
				Expect(checkbox).NotTo(BeSelected())
			})

			By("moving the mouse pointer and double clicking", func() {
				doubleClick := page.Find("#double_click")
				Expect(doubleClick.MouseToElement()).To(Succeed())
				Expect(page.DoubleClick()).To(Succeed())
				Expect(doubleClick).To(HaveText("double-click success"))
			})
		})
	})
}
예제 #7
0
func resetPage(page *agouti.Page, testEnvVars AcceptanceTestEnvVars) {
	page.Navigate(testEnvVars.Hostname + "/v2/logout")
	page.Navigate(testEnvVars.Hostname)
}
예제 #8
0
func testSelection(browserName string, newPage pageFunc) {
	Describe("selection test for "+browserName, func() {
		var (
			page      *agouti.Page
			server    *httptest.Server
			submitted bool
		)

		BeforeEach(func() {
			server = httptest.NewServer(http.HandlerFunc(func(response http.ResponseWriter, request *http.Request) {
				if request.Method == "POST" {
					submitted = true
				}
				html, _ := ioutil.ReadFile("test_page.html")
				response.Write(html)
			}))

			var err error
			page, err = newPage()
			Expect(err).NotTo(HaveOccurred())

			Expect(page.Size(640, 480)).To(Succeed())
			Expect(page.Navigate(server.URL)).To(Succeed())
		})

		AfterEach(func() {
			Expect(page.Destroy()).To(Succeed())
			server.Close()
		})

		It("should support asserting on element identity", func() {
			By("asserting on an element's existence", func() {
				Expect(page.Find("header")).To(BeFound())
				Expect(page.Find("header")).To(HaveCount(1))
				Expect(page.Find("not-a-header")).NotTo(BeFound())
			})

			By("comparing two selections for equality", func() {
				Expect(page.Find("#some_element")).To(EqualElement(page.FindByXPath("//div[@class='some-element']")))
				Expect(page.Find("#some_element")).NotTo(EqualElement(page.Find("header")))
			})
		})

		It("should support moving the mouse pointer over a selected element", func() {
			Expect(page.Find("#some_checkbox").MouseToElement()).To(Succeed())
			Expect(page.Click(agouti.SingleClick, agouti.LeftButton)).To(Succeed())
			Expect(page.Find("#some_checkbox")).To(BeSelected())
		})

		It("should support selecting elements", func() {
			By("finding an element by selection index", func() {
				Expect(page.All("option").At(0)).To(HaveText("first option"))
				Expect(page.All("select").At(1).First("option")).To(HaveText("third option"))
			})

			By("finding an element by chained selectors", func() {
				Expect(page.Find("header").Find("h1")).To(HaveText("Title"))
				Expect(page.Find("header").FindByXPath("//h1")).To(HaveText("Title"))
			})

			By("finding an element by link text", func() {
				Expect(page.FindByLink("Click Me").Attribute("href")).To(HaveSuffix("#new_page"))
			})

			By("finding an element by label text", func() {
				Expect(page.FindByLabel("Some Label")).To(HaveAttribute("value", "some labeled value"))
				Expect(page.FindByLabel("Some Container Label")).To(HaveAttribute("value", "some embedded value"))
			})

			By("finding an element by button text", func() {
				Expect(page.FindByButton("Some Button")).To(HaveAttribute("name", "some button name"))
				Expect(page.FindByButton("Some Input Button")).To(HaveAttribute("type", "button"))
				Expect(page.FindByButton("Some Submit Button")).To(HaveAttribute("type", "submit"))
			})

			By("finding an element by name attibute", func() {
				Expect(page.FindByName("some button name")).To(HaveAttribute("name", "some button name"))
			})

			By("finding multiple elements", func() {
				Expect(page.All("select").All("option")).To(BeVisible())
				Expect(page.All("h1,h2")).NotTo(BeVisible())
			})
		})

		It("should support retrieving element properties", func() {
			By("asserting on element text", func() {
				Expect(page.Find("header")).To(HaveText("Title"))
				Expect(page.Find("header")).NotTo(HaveText("Not-Title"))
				Expect(page.Find("header")).To(MatchText("T.+e"))
				Expect(page.Find("header")).NotTo(MatchText("X.+e"))
			})

			By("asserting on whether elements are active", func() {
				Expect(page.Find("#labeled_field")).NotTo(BeActive())
				Expect(page.Find("#labeled_field").Click()).To(Succeed())
				Expect(page.Find("#labeled_field")).To(BeActive())
			})

			By("asserting on element attributes", func() {
				Expect(page.Find("#some_checkbox")).To(HaveAttribute("type", "checkbox"))
			})

			By("asserting on element CSS", func() {
				Expect(page.Find("#some_element")).To(HaveCSS("color", "rgba(0, 0, 255, 1)"))
				Expect(page.Find("#some_element")).To(HaveCSS("color", "rgb(0, 0, 255)"))
				Expect(page.Find("#some_element")).To(HaveCSS("color", "blue"))
			})

			By("asserting on whether elements are selected", func() {
				Expect(page.Find("#some_checkbox")).NotTo(BeSelected())
				Expect(page.Find("#some_selected_checkbox")).To(BeSelected())
			})

			By("asserting on element visibility", func() {
				Expect(page.Find("header h1")).To(BeVisible())
				Expect(page.Find("header h2")).NotTo(BeVisible())
			})

			By("asserting on whether elements are enabled", func() {
				Expect(page.Find("#some_checkbox")).To(BeEnabled())
				Expect(page.Find("#some_disabled_checkbox")).NotTo(BeEnabled())
			})
		})

		It("should support element actions", func() {
			By("clicking on an element", func() {
				checkbox := page.Find("#some_checkbox")
				Expect(checkbox.Click()).To(Succeed())
				Expect(checkbox).To(BeSelected())
				Expect(checkbox.Click()).To(Succeed())
				Expect(checkbox).NotTo(BeSelected())
			})

			By("double-clicking on an element", func() {
				selection := page.Find("#double_click")
				Expect(selection.DoubleClick()).To(Succeed())
				Expect(selection).To(HaveText("double-click success"))
			})

			By("filling out an element", func() {
				Expect(page.Find("#some_input").Fill("some other value")).To(Succeed())
				Expect(page.Find("#some_input")).To(HaveAttribute("value", "some other value"))
			})

			// NOTE: PhantomJS regression causes crash on file upload
			if browserName != "PhantomJS" {
				By("uploading a file", func() {
					Expect(page.Find("#file_picker").UploadFile("test_page.html")).To(Succeed())
					var result string
					Expect(page.RunScript("return document.getElementById('file_picker').value;", nil, &result)).To(Succeed())
					Expect(result).To(HaveSuffix("test_page.html"))
				})
			}

			By("checking and unchecking a checkbox", func() {
				checkbox := page.Find("#some_checkbox")
				Expect(checkbox.Uncheck()).To(Succeed())
				Expect(checkbox).NotTo(BeSelected())
				Expect(checkbox.Check()).To(Succeed())
				Expect(checkbox).To(BeSelected())
				Expect(checkbox.Uncheck()).To(Succeed())
				Expect(checkbox).NotTo(BeSelected())
			})

			By("selecting an option by text", func() {
				selection := page.Find("#some_select")
				Expect(selection.All("option").At(1)).NotTo(BeSelected())
				Expect(selection.Select("second option")).To(Succeed())
				Expect(selection.All("option").At(1)).To(BeSelected())
			})

			By("submitting a form", func() {
				Expect(page.Find("#some_form").Submit()).To(Succeed())
				Eventually(func() bool { return submitted }).Should(BeTrue())
			})
		})
	})
}
예제 #9
0
func itShouldBehaveLikeAPage(name string, newPage pageFunc) {
	Describe("integration test for "+name, func() {
		var (
			page      *agouti.Page
			server    *httptest.Server
			submitted bool
		)

		BeforeEach(func() {
			server = httptest.NewServer(http.HandlerFunc(func(response http.ResponseWriter, request *http.Request) {
				if request.Method == "POST" {
					submitted = true
				}
				html, _ := ioutil.ReadFile("test_page.html")
				response.Write(html)
			}))

			var err error
			page, err = newPage()
			Expect(err).NotTo(HaveOccurred())

			Expect(page.Size(640, 480)).To(Succeed())
			Expect(page.Navigate(server.URL)).To(Succeed())
		})

		AfterEach(func() {
			Expect(page.Destroy()).To(Succeed())
			server.Close()
		})

		Describe("Selection interactions", func() {
			It("should support asserting on element identity", func() {
				By("asserting on an element's existence", func() {
					Expect(page.Find("header")).To(BeFound())
					Expect(page.Find("header")).To(HaveCount(1))
					Expect(page.Find("not-a-header")).NotTo(BeFound())
				})

				By("comparing two selections for equality", func() {
					Expect(page.Find("#some_element")).To(EqualElement(page.FindByXPath("//div[@class='some-element']")))
				})
			})

			It("should support selecting elements", func() {
				By("finding an element by selection index", func() {
					Expect(page.All("option").At(0)).To(HaveText("first option"))
					Expect(page.All("select").At(1).First("option")).To(HaveText("third option"))
				})

				By("finding an element by chained selectors", func() {
					Expect(page.Find("header").Find("h1")).To(HaveText("Title"))
					Expect(page.Find("header").FindByXPath("//h1")).To(HaveText("Title"))
				})

				By("finding an element by link text", func() {
					Expect(page.FindByLink("Click Me").Attribute("href")).To(HaveSuffix("#new_page"))
				})

				By("finding an element by label text", func() {
					Expect(page.FindByLabel("Some Label")).To(HaveAttribute("value", "some labeled value"))
					Expect(page.FindByLabel("Some Container Label")).To(HaveAttribute("value", "some embedded value"))
				})

				By("finding an element by button text", func() {
					Expect(page.FindByButton("Some Button")).To(HaveAttribute("name", "some button name"))
					Expect(page.FindByButton("Some Input Button")).To(HaveAttribute("type", "button"))
					Expect(page.FindByButton("Some Submit Button")).To(HaveAttribute("type", "submit"))
				})

				By("finding an element by class", func() {
					Expect(page.FindByClass("some-element")).To(HaveAttribute("id", "some_element"))
				})

				By("finding an element by ID", func() {
					Expect(page.FindByID("some_element")).To(HaveAttribute("class", "some-element"))
				})

				By("finding multiple elements", func() {
					Expect(page.All("select").All("option")).To(BeVisible())
					Expect(page.All("h1,h2")).NotTo(BeVisible())
				})
			})

			It("should support retrieving element properties", func() {
				By("asserting on element text", func() {
					Expect(page.Find("header")).To(HaveText("Title"))
					Expect(page.Find("header")).NotTo(HaveText("Not-Title"))
					Expect(page.Find("header")).To(MatchText("T.+e"))
					Expect(page.Find("header")).NotTo(MatchText("X.+e"))
				})

				By("asserting on whether elements are active", func() {
					Expect(page.Find("#labeled_field")).NotTo(BeActive())
					Expect(page.Find("#labeled_field").Click()).To(Succeed())
					Expect(page.Find("#labeled_field")).To(BeActive())
				})

				By("asserting on element attributes", func() {
					Expect(page.Find("#some_checkbox")).To(HaveAttribute("type", "checkbox"))
				})

				By("asserting on element CSS", func() {
					Expect(page.Find("#some_element")).To(HaveCSS("color", "rgba(0, 0, 255, 1)"))
					Expect(page.Find("#some_element")).To(HaveCSS("color", "rgb(0, 0, 255)"))
					Expect(page.Find("#some_element")).To(HaveCSS("color", "blue"))
				})

				By("asserting on whether elements are selected", func() {
					Expect(page.Find("#some_checkbox")).NotTo(BeSelected())
					Expect(page.Find("#some_selected_checkbox")).To(BeSelected())
				})

				By("asserting on element visibility", func() {
					Expect(page.Find("header h1")).To(BeVisible())
					Expect(page.Find("header h2")).NotTo(BeVisible())
				})

				By("asserting on whether elements are enabled", func() {
					Expect(page.Find("#some_checkbox")).To(BeEnabled())
					Expect(page.Find("#some_disabled_checkbox")).NotTo(BeEnabled())
				})
			})

			It("should support element actions", func() {
				By("clicking on an element", func() {
					checkbox := page.Find("#some_checkbox")
					Expect(checkbox.Click()).To(Succeed())
					Expect(checkbox).To(BeSelected())
					Expect(checkbox.Click()).To(Succeed())
					Expect(checkbox).NotTo(BeSelected())
				})

				By("double-clicking on an element", func() {
					selection := page.Find("#double_click")
					Expect(selection.DoubleClick()).To(Succeed())
					Expect(selection).To(HaveText("double-click success"))
				})

				By("filling out an element", func() {
					Expect(page.Find("#some_input").Fill("some other value")).To(Succeed())
					Expect(page.Find("#some_input")).To(HaveAttribute("value", "some other value"))
				})

				// NOTE: PhantomJS regression causes crash on file upload
				if name != "PhantomJS" {
					By("uploading a file", func() {
						Expect(page.Find("#file_picker").UploadFile("test_page.html")).To(Succeed())
						var result string
						Expect(page.RunScript("return document.getElementById('file_picker').value;", nil, &result)).To(Succeed())
						Expect(result).To(HaveSuffix("test_page.html"))
					})
				}

				By("checking and unchecking a checkbox", func() {
					checkbox := page.Find("#some_checkbox")
					Expect(checkbox.Uncheck()).To(Succeed())
					Expect(checkbox).NotTo(BeSelected())
					Expect(checkbox.Check()).To(Succeed())
					Expect(checkbox).To(BeSelected())
					Expect(checkbox.Uncheck()).To(Succeed())
					Expect(checkbox).NotTo(BeSelected())
				})

				By("selecting an option by text", func() {
					selection := page.Find("#some_select")
					Expect(selection.All("option").At(1)).NotTo(BeSelected())
					Expect(selection.Select("second option")).To(Succeed())
					Expect(selection.All("option").At(1)).To(BeSelected())
				})

				By("submitting a form", func() {
					Expect(page.Find("#some_form").Submit()).To(Succeed())
					Eventually(func() bool { return submitted }).Should(BeTrue())
				})
			})
		})

		Describe("Page interactions", func() {
			It("should support retrieving page properties", func() {
				Expect(page).To(HaveTitle("Page Title"))
				Expect(page).To(HaveURL(server.URL + "/"))
				Expect(page.HTML()).To(ContainSubstring("<h1>Title</h1>"))
			})

			It("should support JavaScript", func() {
				By("waiting for page JavaScript to take effect", func() {
					Expect(page.Find("#some_element")).NotTo(HaveText("some text"))
					Eventually(page.Find("#some_element"), "4s").Should(HaveText("some text"))
					Consistently(page.Find("#some_element")).Should(HaveText("some text"))
				})

				// NOTE: disabled due to recent Firefox regression with passing args
				if name != "Firefox" {
					By("executing provided JavaScript", func() {
						arguments := map[string]interface{}{"elementID": "some_element"}
						var result string
						Expect(page.RunScript("return document.getElementById(elementID).innerHTML;", arguments, &result)).To(Succeed())
						Expect(result).To(Equal("some text"))
					})
				}
			})

			It("should support taking screenshots", func() {
				Expect(page.Screenshot(".test.screenshot.png")).To(Succeed())
				defer os.Remove(".test.screenshot.png")
				file, _ := os.Open(".test.screenshot.png")
				_, err := png.Decode(file)
				Expect(err).NotTo(HaveOccurred())
			})

			It("should support links and navigation", func() {
				By("clicking on a link", func() {
					Expect(page.FindByLink("Click Me").Click()).To(Succeed())
					Expect(page.URL()).To(ContainSubstring("#new_page"))
				})

				By("navigating through browser history", func() {
					Expect(page.Back()).To(Succeed())
					Expect(page.URL()).NotTo(ContainSubstring("#new_page"))
					Expect(page.Forward()).To(Succeed())
					Expect(page.URL()).To(ContainSubstring("#new_page"))
				})

				By("refreshing the page", func() {
					checkbox := page.Find("#some_checkbox")
					Expect(checkbox.Check()).To(Succeed())
					Expect(page.Refresh()).To(Succeed())
					Expect(checkbox).NotTo(BeSelected())
				})
			})

			// NOTE: browsers besides PhantomJS do not support JavaScript logs
			if name == "PhantomJS" {
				It("should support retrieving logs", func() {
					Eventually(page).Should(HaveLoggedInfo("some log"))
					Expect(page).NotTo(HaveLoggedError())
					Eventually(page, "4s").Should(HaveLoggedError("ReferenceError: Can't find variable: doesNotExist\n  (anonymous function)"))
				})
			}

			It("should support switching frames", func() {
				By("switching to an iframe", func() {
					Expect(page.Find("#frame").SwitchToFrame()).To(Succeed())
					Expect(page.Find("body")).To(MatchText("Example Domain"))
				})

				// NOTE: PhantomJS does not support Page.SwitchToParentFrame
				if name != "PhantomJS" {
					By("switching back to the default frame by referring to the parent frame", func() {
						Expect(page.SwitchToParentFrame()).To(Succeed())
						Expect(page.Find("body")).NotTo(MatchText("Example Domain"))
					})

					Expect(page.Find("#frame").SwitchToFrame()).To(Succeed())
				}

				By("switching back to the default frame by referring to the root frame", func() {
					Expect(page.SwitchToRootFrame()).To(Succeed())
					Expect(page.Find("body")).NotTo(MatchText("Example Domain"))
				})
			})

			It("should support switching windows", func() {
				Expect(page.Find("#new_window").Click()).To(Succeed())
				Expect(page).To(HaveWindowCount(2))

				By("switching windows", func() {
					Expect(page.SwitchToWindow("new window")).To(Succeed())
					Expect(page.Find("header")).NotTo(BeFound())
					Expect(page.NextWindow()).To(Succeed())
					Expect(page.Find("header")).To(BeFound())
				})

				By("closing windows", func() {
					Expect(page.CloseWindow()).To(Succeed())
					Expect(page).To(HaveWindowCount(1))
				})
			})

			// NOTE: PhantomJS does not support popup boxes
			if name != "PhantomJS" {
				It("should support popup boxes", func() {
					By("interacting with alert popups", func() {
						Expect(page.Find("#popup_alert").Click()).To(Succeed())
						Expect(page).To(HavePopupText("some alert"))
						Expect(page.ConfirmPopup()).To(Succeed())
					})

					By("interacting with confirm boxes", func() {
						var confirmed bool

						Expect(page.Find("#popup_confirm").Click()).To(Succeed())

						Expect(page.ConfirmPopup()).To(Succeed())
						Expect(page.RunScript("return confirmed;", nil, &confirmed)).To(Succeed())
						Expect(confirmed).To(BeTrue())

						Expect(page.Find("#popup_confirm").Click()).To(Succeed())

						Expect(page.CancelPopup()).To(Succeed())
						Expect(page.RunScript("return confirmed;", nil, &confirmed)).To(Succeed())
						Expect(confirmed).To(BeFalse())
					})

					By("interacting with prompt boxes", func() {
						var promptText string

						Expect(page.Find("#popup_prompt").Click()).To(Succeed())

						Expect(page.EnterPopupText("banana")).To(Succeed())
						Expect(page.ConfirmPopup()).To(Succeed())
						Expect(page.RunScript("return promptText;", nil, &promptText)).To(Succeed())
						Expect(promptText).To(Equal("banana"))
					})
				})
			}

			It("should support manipulating and retrieving cookies", func() {
				Expect(page.SetCookie(&http.Cookie{Name: "webdriver-test-cookie", Value: "webdriver value"})).To(Succeed())
				cookies, err := page.GetCookies()
				Expect(err).NotTo(HaveOccurred())
				cookieNames := []string{cookies[0].Name, cookies[1].Name}
				Expect(cookieNames).To(ConsistOf("webdriver-test-cookie", "browser-test-cookie"))
				Expect(page.DeleteCookie("browser-test-cookie")).To(Succeed())
				Expect(page.GetCookies()).To(HaveLen(1))
				Expect(page.ClearCookies()).To(Succeed())
				Expect(page.GetCookies()).To(HaveLen(0))
			})
		})
	})
}
예제 #10
0
				Expect(page.Destroy()).To(Succeed())
			})

			Context("when dev is enabled", func() {
				BeforeEach(func() {
					args = append(args, fmt.Sprintf("-httpPort=%d", httpPort))
					args = append(args, "-dev")
				})

				It("does not redirect to /login", func() {
					session = startMainWithArgs(args...)
					Eventually(session).Should(gbytes.Say("garagepi started"))

					url := fmt.Sprintf("http://localhost:%d/", httpPort)

					Expect(page.Navigate(url)).To(Succeed())
					Expect(page).Should(HaveURL(url))
				})
			})

			Context("when dev is disabled and username/password are provided", func() {
				Describe("logging in", func() {
					const (
						username = "******"
						password = "******"
					)

					var (
						expectedLoginURL    string
						expectedHomepageURL string
					)
var _ = Describe("UserLogin", func() {
	var page *agouti.Page

	BeforeEach(func() {
		var err error
		page, err = agoutiDriver.NewPage()
		Expect(err).NotTo(HaveOccurred())
	})

	AfterEach(func() {
		Expect(page.Destroy()).To(Succeed())
	})

	It("should manage user authentication", func() {
		By("redirecting the user to the login form from the webapp page", func() {
			Expect(page.Navigate(AcceptanceSettings("webappUrl"))).To(Succeed())
		})

		By("allowing the user to fill out the login form and submit it", func() {
			Eventually(page.FindByName("email")).Should(BeFound())
			Expect(page.FindByName("email").Fill(AcceptanceSettings("email"))).To(Succeed())
			Expect(page.FindByName("password").Fill(AcceptanceSettings("password"))).To(Succeed())
			Expect(page.FirstByButton("Get Access").Submit()).To(Succeed())
		})

		By("allowing the user to view its data", func() {
			Eventually(page.Find("#user-context")).Should(BeFound())
			Expect(page.Find("#user-context").Click()).To(Succeed())
			Expect(page.Find(".user-submenu")).To(BeVisible())
			Expect(page.Find(".user-submenu .submenu-data p").Text()).To(Equal("Signed in as\nAcceptance Tests"))
		})
예제 #12
0
			By("saving the job using the service", func() {
				jobService.SaveStub = func(job *jobs.Job) error {
					defer GinkgoRecover()
					Expect(job.Name).To(Equal("Alice"))
					Expect(job.Command).To(Equal("bork bork"))
					Expect(job.DockerImage).To(Equal("user/image:tag"))
					Expect(job.GitRepository).To(Equal("some-repo.git"))
					job.ID = "some-id"
					return nil
				}

				jobService.RunJobReturns(4, nil)
				jobService.FindBuildReturns(build, nil)

				Expect(page.Navigate(fmt.Sprintf("%s/jobs/new", server.URL))).To(Succeed())
				pageobjects.NewNewJobPage(page).CreateJob("Alice", "bork bork", "user/image:tag", "some-repo.git")

				Expect(jobService.SaveCallCount()).To(Equal(1))
			})

			By("redirecting to the build output page", func() {
				Eventually(page).Should(HaveURL(fmt.Sprintf("%s/jobs/some-id/builds/4", server.URL)))
			})

			By("running job", func() {
				Eventually(page.Find("#jobOutput")).Should(HaveText("boom!"))
				Eventually(page.Find("#jobResult")).Should(HaveText("Success"))

				Expect(jobService.RunJobCallCount()).To(Equal(1))
				Expect(jobService.RunJobArgsForCall(0)).To(Equal("some-id"))
예제 #13
0
		By("having the active tab set to default space users", func() {
			Eventually(page.First(".test-subnav-users")).Should(BeVisible())
			Expect(page.First(".test-subnav-users .active").Text()).To(Equal("Current space users"))
		})

		By("seeing a user list for spaces on the first page by default", func() {
			Eventually(page.First("table")).Should(BeFound())
			Eventually(page.First("table tbody tr")).Should(BeFound())
		})
	})

	It("should allow a org manager to see a list of users for an org", func() {
		By("allowing the user to navigate to the space users page", func() {
			Expect(page.Navigate(fmt.Sprintf(testEnvVars.Hostname+
				"/#/org/%s/spaces/%s/users",
				testOrg, testSpace))).To(Succeed())
		})

		By("allowing the user to navigate to the all org users page", func() {
			var orgUsersLink = page.FindByLink("All organization users")
			Eventually(orgUsersLink).Should(BeFound())
			Expect(orgUsersLink.Click()).To(Succeed())
		})

		By("seeing a user list for the whole org", func() {
			var table = page.First("table")
			Eventually(table).Should(BeFound())
			var rows = table.First("tbody tr")
			Eventually(rows).Should(BeFound())
			Expect(rows.Count()).Should(BeNumerically(">=", 1))
예제 #14
0
			})

			Context("with more then 100 job builds", func() {
				var testBuilds []db.Build

				BeforeEach(func() {
					for i := 1; i < 103; i++ {
						build, err := pipelineDB.CreateJobBuild("job-name")
						Expect(err).NotTo(HaveOccurred())
						testBuilds = append(testBuilds, build)
					}
				})

				It("can have paginated results", func() {
					// homepage -> job detail w/build info
					Expect(page.Navigate(homepage())).To(Succeed())
					// we will need to authenticate later to prove it is working for our page
					Authenticate(page, "admin", "password")
					Eventually(page.FindByLink("job-name")).Should(BeFound())
					Expect(page.FindByLink("job-name").Click()).To(Succeed())

					Eventually(page.All("#builds li").Count).Should(Equal(103))

					// job detail w/build info -> job detail
					Eventually(page.Find("h1 a")).Should(BeFound())
					Expect(page.Find("h1 a").Click()).To(Succeed())
					Eventually(page).Should(HaveURL(withPath("jobs/job-name")))
					Eventually(page.All(".js-build").Count).Should(Equal(100))

					Expect(page.First(".pagination .disabled .fa-arrow-left")).Should(BeFound())
					Expect(page.First(".pagination .fa-arrow-right").Click()).To(Succeed())
예제 #15
0
				Expect(err).NotTo(HaveOccurred())

				sqlDB.SaveBuildEvent(build.ID, event.Log{
					Origin: event.Origin{
						Source: event.OriginSourceStdout,
						ID:     "some-id",
					},
					Payload: "hello this is a payload",
				})

				Expect(sqlDB.FinishBuild(build.ID, db.StatusSucceeded)).To(Succeed())
			})

			It("can view the resource", func() {
				// homepage -> job detail w/build info
				Expect(page.Navigate(homepage())).To(Succeed())
				// we will need to authenticate later to prove it is working for our page
				Authenticate(page, "admin", "password")
				Eventually(page.FindByLink("job-name")).Should(BeFound())
				Expect(page.FindByLink("job-name").Click()).To(Succeed())

				// job detail w/build info -> job detail
				Eventually(page).Should(HaveURL(withPath(fmt.Sprintf("jobs/job-name/builds/%d", build.ID))))
				Eventually(page.Find("h1")).Should(HaveText(fmt.Sprintf("job-name #%d", build.ID)))
				Expect(page.Find("h1 a").Click()).To(Succeed())
				Eventually(page).Should(HaveURL(withPath("jobs/job-name")))

				// job-detail pausing
				Eventually(page.Find("#job-state.btn-pause")).Should(BeFound())
				Expect(page.Find("#job-state.btn-pause").Click()).To(Succeed())
				Eventually(page.Find("#job-state.btn-pause.enabled")).Should(BeFound())
예제 #16
0
var INTEGRATION_TEST_DATA map[string]string = map[string]string{
	"newUserEmail":         "*****@*****.**",
	"newUserPassword":      "******",
	"fixtureUserEmail":     "*****@*****.**",
	"fixtureUserPassword":  "******",
	"fixtureAdminEmail":    "*****@*****.**",
	"fixtureAdminPassword": "******",
}

var _ = Describe("CasGo", func() {
	var page *agouti.Page

	BeforeEach(func() {
		page, err := agoutiDriver.NewPage()
		Expect(err).NotTo(HaveOccurred())
		page.Navigate(testHTTPServer.URL)
		page.Size(640, 480)
	})

	AfterEach(func() {
		page.Destroy()
	})

	It("Finding the expected title on the index page", func() {
		Expect(page).To(HaveTitle("CasGo"))
	})

	It("Find the expected title on the login page", func() {
		page.Navigate(testHTTPServer.URL + "/login")
		expectedTitle := testCASServer.Config["companyName"] + " - Login"
		Expect(page.Find("#page-title")).To(HaveText(expectedTitle))
import (
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
	"github.com/sclevine/agouti"
	. "github.com/sclevine/agouti/matchers"
)

var _ = Describe("Angular", func() {
	var page *agouti.Page

	It("should redirect / to #/", func() {
		var err error
		page, err = agoutiDriver.NewPage()
		Expect(err).NotTo(HaveOccurred())
		Expect(page.Navigate("http://localhost:8080")).To(Succeed())
		Expect(page).To(HaveURL("http://localhost:8080/#/"))
	})

	Describe("Phone list view", func() {
		BeforeEach(func() {
			var err error
			page, err = agoutiDriver.NewPage()
			Expect(err).NotTo(HaveOccurred())
			Expect(page.Navigate("http://localhost:8080/#/phones")).To(Succeed())
		})

		AfterEach(func() {
			Expect(page.Destroy()).To(Succeed())
		})
예제 #18
0
				_, err = pipelineDBFactory.BuildWithTeamNameAndName(team.Name, "some-pipeline")
				Expect(err).NotTo(HaveOccurred())

				_, err = pipelineDBFactory.BuildWithTeamNameAndName(team.Name, "another-pipeline")
				Expect(err).NotTo(HaveOccurred())

			})

			homeLink := ".js-groups li:nth-of-type(2) a"
			defaultPipelineLink := ".js-pipelinesNav-list li:nth-of-type(1) a"
			anotherPipelineLink := ".js-pipelinesNav-list li:nth-of-type(2) a"
			anotherPipelineItem := ".js-pipelinesNav-list li:nth-of-type(2)"

			It("can pause the pipelines", func() {
				Expect(page.Navigate(homepage())).To(Succeed())
				// we will need to authenticate later to prove it is working for our page
				Authenticate(page, "admin", "password")

				Eventually(page.Find("#pipeline").Text).Should(ContainSubstring("some-job-name"))

				Expect(page.Find(".js-pipelinesNav-toggle").Click()).To(Succeed())

				Expect(page.Find(defaultPipelineLink)).To(HaveText("some-pipeline"))
				Expect(page.Find(anotherPipelineLink)).To(HaveText("another-pipeline"))

				Expect(page.Find(anotherPipelineLink).Click()).To(Succeed())

				Eventually(page).Should(HaveURL(withPath("/pipelines/another-pipeline")))
				Expect(page.Find(homeLink).Click()).To(Succeed())
				Eventually(page).Should(HaveURL(withPath("/pipelines/another-pipeline")))
예제 #19
0
	Describe("Web form", func() {
		var page *agouti.Page

		BeforeEach(func() {
			var err error
			page, err = agoutiDriver.NewPage()
			Expect(err).NotTo(HaveOccurred())
		})

		AfterEach(func() {
			Expect(page.Destroy()).To(Succeed())
		})
		It("provide a web interface to the API", func() {
			By("having a root page", func() {
				Expect(page.Navigate("http://" + address)).To(Succeed())
			})

			By("allowing the user to fill out the form and run a simulation", func() {
				Eventually(page.FindByName("NumHosts")).Should(BeFound())
				Expect(page.FindByName("NumHosts").Fill("100")).To(Succeed())
				Expect(page.FindByName("NumApps").Fill("300")).To(Succeed())
				Expect(page.FindByName("MeanInstancesPerApp").Fill("5")).To(Succeed())
				Expect(page.FindByButton("Simulate").Click()).To(Succeed())
			})

			By("showing a histogram of app sizes", func() {
				Eventually(page.HTML).Should(ContainSubstring(`Size (instances)`))
				Eventually(page.HTML).Should(ContainSubstring(`40</text>`)) // tick mark on y axis
			})
		})
예제 #20
0
var _ = Describe("ListJobs", func() {
	var page *agouti.Page

	BeforeEach(func() {
		var err error
		page, err = agoutiDriver.NewPage()
		Expect(err).NotTo(HaveOccurred())
	})

	AfterEach(func() {
		Expect(page.Destroy()).To(Succeed())
	})

	It("shows a list of jobs", func() {
		By("root url redirects to jobs page", func() {
			Expect(page.Navigate("http://localhost:3001")).To(Succeed())
			Eventually(page.Find("a#newJob")).Should(BeFound())
		})

		By("creating a new job", func() {
			pageobjects.NewListJobsPage(page).GoToCreateNewJob().CreateJob("Jerb", "echo hello", "busybox", "")
		})

		By("list includes the job on jobs page", func() {
			Expect(page.Navigate("http://localhost:3001/jobs")).To(Succeed())
			Eventually(page.Find(".job:first-of-type")).Should(MatchText(".*Jerb.*"))
		})
	})
})
예제 #21
0
package main_test

import (
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
	"github.com/sclevine/agouti"
	. "github.com/sclevine/agouti/matchers"
)

var _ = Describe("Home", func() {
	var page *agouti.Page

	BeforeEach(func() {
		var err error
		page, err = agoutiDriver.NewPage()
		Expect(err).NotTo(HaveOccurred())
	})

	AfterEach(func() {
		Expect(page.Destroy()).To(Succeed())
	})

	It("Should redirect / to #/", func() {
		var err error
		page, err = agoutiDriver.NewPage()
		Expect(err).NotTo(HaveOccurred())
		Expect(page.Navigate("http://localhost:8080")).To(Succeed())
		Expect(page).To(HaveURL("http://localhost:8080/#/"))
	})
})
예제 #22
0
				Expect(err).NotTo(HaveOccurred())

				sqlDB.SaveBuildEvent(oneOffBuild.ID, event.Log{
					Origin: event.Origin{
						Name:     "origin-name",
						Type:     event.OriginTypeTask,
						Source:   event.OriginSourceStdout,
						Location: location,
					},
					Payload: "hello this is a payload",
				})
			})

			It("can view builds", func() {
				// homepage -> build list
				Expect(page.Navigate(homepage() + "/pipelines/main")).To(Succeed())
				Eventually(page.Find(allBuildsListIcon)).Should(BeFound())

				Authenticate(page, "admin", "password")

				Expect(page.Find(allBuildsListIconLink).Click()).To(Succeed())

				// build list -> one off build detail
				Eventually(page).Should(HaveURL(withPath("/builds")))
				Expect(page.Find("h1")).To(HaveText("builds"))
				Expect(page.Find(firstBuildNumber).Text()).To(ContainSubstring(fmt.Sprintf("%d", oneOffBuild.ID)))
				Expect(page.Find(firstBuildLink).Click()).To(Succeed())

				// one off build detail
				Eventually(page.Find("h1")).Should(HaveText(fmt.Sprintf("build #%d", oneOffBuild.ID)))
				Eventually(page.Find("#build-logs").Text).Should(ContainSubstring("hello this is a payload"))
예제 #23
0
func testMobile(browserName string, newPage pageFunc) {
	Describe("mobile test for "+browserName, func() {
		var (
			page   *agouti.Page
			server *httptest.Server
		)

		BeforeEach(func() {
			server = httptest.NewServer(http.HandlerFunc(func(response http.ResponseWriter, request *http.Request) {
				html, _ := ioutil.ReadFile("mobile_test_page.html")
				response.Write(html)
			}))

			var err error
			page, err = newPage()
			Expect(err).NotTo(HaveOccurred())

			Expect(page.Size(640, 480)).To(Succeed())
			port := strings.Split(server.URL, ":")[2]
			Expect(page.Navigate("http://10.0.2.2:" + port)).To(Succeed())
		})

		AfterEach(func() {
			Expect(page.Destroy()).To(Succeed())
			server.Close()
		})

		It("should support various touch events", func() {
			touch := page.Find("#touch")
			message := page.Find("#message")

			By("performing tap actions", func() {
				Expect(touch.Tap(agouti.SingleTap)).To(Succeed())
				Eventually(message).Should(HaveText("event: start with 1 end with 0"))
				Expect(page.Refresh()).To(Succeed())
				Expect(touch.Tap(agouti.DoubleTap)).To(Succeed())
				Eventually(message).Should(HaveText("event: start with 1 end with 0 start with 1 end with 0"))
			})

			By("performing touch actions", func() {
				Expect(page.Refresh()).To(Succeed())
				Expect(touch.Touch(agouti.HoldFinger)).To(Succeed())
				Eventually(message).Should(HaveText("event: start with 1"))
				Expect(page.Refresh()).To(Succeed())
				Expect(touch.Touch(agouti.HoldFinger)).To(Succeed())
				Expect(touch.Touch(agouti.ReleaseFinger)).To(Succeed())
				Eventually(message).Should(HaveText("event: start with 1 end with 0"))
			})

			By("performing a flick", func() {
				Expect(page.Refresh()).To(Succeed())
				Expect(touch.FlickFinger(10, 10, 10)).To(Succeed())
				Eventually(message).Should(HaveText("event: start with 1 end with 0"))
			})

			By("performing a finger scroll", func() {
				Expect(page.Refresh()).To(Succeed())
				Expect(touch.ScrollFinger(40, 50)).To(Succeed())
				Eventually(message).Should(MatchText("event: scroll left [45][0-9] scroll top [56][0-9]"))
			})
		})
	})
}