// FlickFinger performs a flick touch action by the provided offset and at the
// provided speed on exactly one element.
func (s *Selection) FlickFinger(xOffset, yOffset int, speed uint) error {
	selectedElement, err := s.elements.GetExactlyOne()
	if err != nil {
		return fmt.Errorf("failed to select element from %s: %s", s, err)
	}

	if err := s.session.TouchFlick(selectedElement.(*api.Element), api.XYOffset{X: xOffset, Y: yOffset}, api.ScalarSpeed(speed)); err != nil {
		return fmt.Errorf("failed to flick finger on %s: %s", s, err)
	}
	return nil
}
		})
	})

	Describe("#FlickFinger", func() {
		var firstElement *api.Element

		BeforeEach(func() {
			firstElement = &api.Element{}
			elementRepository.GetExactlyOneCall.ReturnElement = firstElement
		})

		It("should successfully flick on the selected element", func() {
			Expect(selection.FlickFinger(100, 200, 300)).To(Succeed())
			Expect(session.TouchFlickCall.Element).To(ExactlyEqual(firstElement))
			Expect(session.TouchFlickCall.Offset).To(Equal(api.XYOffset{X: 100, Y: 200}))
			Expect(session.TouchFlickCall.Speed).To(Equal(api.ScalarSpeed(300)))
		})

		Context("when exactly one element is not returned", func() {
			It("should return an error", func() {
				elementRepository.GetExactlyOneCall.Err = errors.New("some error")
				Expect(selection.FlickFinger(100, 200, 300)).To(MatchError("failed to select element from selection 'CSS: #selector': some error"))
			})
		})

		Context("when the flick fails", func() {
			It("should return an error", func() {
				session.TouchFlickCall.Err = errors.New("some error")
				Expect(selection.FlickFinger(100, 200, 300)).To(MatchError("failed to flick finger on selection 'CSS: #selector': some error"))
			})
		})