Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tomasz Nowak - Web Application Testing made easy

Tomasz Nowak - Web Application Testing made easy

Web Application Testing made easy

Base Lab

April 30, 2014
Tweet

More Decks by Base Lab

Other Decks in Programming

Transcript

  1. PAGE OBJECT PATTERN Technique for structuring test code that: Promotes

    reuse and reduces duplication Makes tests readable Makes tests more robust (less brittle) Improves maintainability, particularly if the application is rapidly evolving
  2. THE PAGE OBJECT Allows to model UI in test code

    Consolidates the code for interacting with any given UI element Exposes methods that reflect the things a user can see and do on that page Hides the details of telling the browser how to do those things
  3. SOFTWARE STACK WE ARE USING - test runner - browser

    runner rspec watir page-object factory-girl jenkins
  4. watir r e q u i r e ' w

    a t i r - w e b d r i v e r ' b r o w s e r = W a t i r : : B r o w s e r . n e w : c h r o m e b r o w s e r . g o t o " h t t p : / / t r a n s l a t e . g o o g l e . c o m / " b r o w s e r . d i v ( i d : " g t - s l - g m s " ) . c l i c k m e n u = b r o w s e r . d i v ( i d : " g t - s l - g m s - m e n u " ) m e n u . w h e n _ p r e s e n t . d i v ( c l a s s : " g o o g - m e n u i t e m " , t e x t : " N o r w e g i a n " ) . c l i c k p u t s b r o w s e r . d i v ( c s s : " . j f k - b u t t o n - c h e c k e d " ) . t e x t b r o w s e r . t e x t _ f i e l d ( i d : " s o u r c e " ) . s e t ( " o s t " ) r e s u l t _ b o x = b r o w s e r . s p a n ( i d : " r e s u l t _ b o x " ) b r o w s e r . w a i t _ u n t i l { r e s u l t _ b o x . t e x t . l e n g t h > 0 } p u t s r e s u l t _ b o x . t e x t b r o w s e r . c l o s e
  5. Test scenario: Add a new lead r e q u

    i r e ' s p e c _ h e l p e r ' d e s c r i b e " L e a d s " d o d e s c r i b e " A d d a l e a d w i t h s t a n d a r d f i e l d s " d o b e f o r e ( : a l l ) d o @ l e a d = b u i l d ( : l e a d ) o n ( D a s h b o a r d P a g e ) . g o _ t o _ l e a d s e n d i t " O p e n a n e w l e a d f o r m " d o o n ( L e a d s P a g e ) . o p e n _ n e w _ l e a d e n d i t " P o p u l a t e d a t a f o r n e w l e a d " d o o n ( N e w L e a d P a g e ) . p o p u l a t e _ p a g e _ w i t h ( @ l e a d ) o n ( N e w L e a d P a g e ) . s a v e e n d i t " C h e c k m o b i l e " d o e x p e c t ( o n ( L e a d P a g e ) . m o b i l e . t e x t ) . t o e q ( @ l e a d . m o b i l e ) e n d i t " C h e c k p h o n e " d o e x p e c t ( o n ( L e a d P a g e ) . p h o n e . t e x t ) . t o e q ( @ l e a d . p h o n e ) e n d i t " C h e c k e m a i l " d o e x p e c t ( o n ( L e a d P a g e ) . e m a i l . t e x t ) . t o e q ( @ l e a d . e m a i l ) e n d e n d e n d
  6. GIVEN - DATA SETUP b e f o r e

    ( : a l l ) d o @ l e a d = b u i l d ( : l e a d ) o n ( D a s h b o a r d P a g e ) . g o _ t o _ l e a d s e n d
  7. Lead model r e q u i r e '

    h a s h i e ' m o d u l e M o d e l c l a s s L e a d < H a s h i e : : D a s h p r o p e r t y : f i r s t _ n a m e p r o p e r t y : l a s t _ n a m e p r o p e r t y : c o m p a n y _ n a m e p r o p e r t y : t i t l e p r o p e r t y : e m a i l p r o p e r t y : m o b i l e p r o p e r t y : p h o n e p r o p e r t y : s t r e e t p r o p e r t y : c i t y p r o p e r t y : r e g i o n p r o p e r t y : z i p p r o p e r t y : c o u n t r y p r o p e r t y : u s e r e n d e n d
  8. Lead factory r e q u i r e _

    r e l a t i v e ' . . / m o d e l s / l e a d ' F a c t o r y G i r l . d e f i n e d o f a c t o r y : l e a d , c l a s s : M o d e l : : L e a d d o f i r s t _ n a m e { F a k e r : : N a m e . f i r s t _ n a m e } l a s t _ n a m e { F a k e r : : N a m e . l a s t _ n a m e } c o m p a n y _ n a m e { F a k e r : : C o m p a n y . n a m e } t i t l e { F a k e r : : N a m e . t i t l e } e m a i l { F a k e r : : I n t e r n e t . e m a i l } m o b i l e { F a k e r : : P h o n e N u m b e r . c e l l _ p h o n e } p h o n e { F a k e r : : P h o n e N u m b e r . p h o n e _ n u m b e r } s t r e e t { F a k e r : : A d d r e s s . s t r e e t _ a d d r e s s } c i t y { F a k e r : : A d d r e s s . c i t y } r e g i o n { F a k e r : : A d d r e s s . s t a t e } z i p { F a k e r : : A d d r e s s . z i p } c o u n t r y ' U n i t e d S t a t e s ' e n d e n d
  9. WHEN - TEST EXECUTION i t " O p e

    n a n e w l e a d f o r m " d o o n ( L e a d s P a g e ) . o p e n _ n e w _ l e a d e n d i t " P o p u l a t e d a t a f o r n e w l e a d " d o o n ( N e w L e a d P a g e ) . p o p u l a t e _ p a g e _ w i t h ( @ l e a d ) o n ( N e w L e a d P a g e ) . s a v e e n d
  10. New Lead Page c l a s s N e

    w L e a d P a g e < A b s t r a c t P a g e i n c l u d e P a g e O b j e c t p a g e _ u r l ( " h t t p s : / / a p p . f u t u r e s i m p l e . c o m / l e a d s / n e w " ) t e x t _ f i e l d ( : f i r s t _ n a m e , : i d = > " l e a d - f i r s t - n a m e " ) t e x t _ f i e l d ( : l a s t _ n a m e , : i d = > " l e a d - l a s t - n a m e " ) t e x t _ f i e l d ( : c o m p a n y _ n a m e , : i d = > " l e a d - c o m p a n y - n a m e " ) t e x t _ f i e l d ( : t i t l e , : i d = > " l e a d - t i t l e " ) t e x t _ f i e l d ( : e m a i l , : i d = > " l e a d - e m a i l " ) t e x t _ f i e l d ( : m o b i l e , : i d = > " l e a d - m o b i l e " ) t e x t _ f i e l d ( : p h o n e , : i d = > " l e a d - p h o n e " ) t e x t _ f i e l d ( : s t r e e t , : i d = > " l e a d - s t r e e t " ) t e x t _ f i e l d ( : c i t y , : i d = > " l e a d - c i t y " ) t e x t _ f i e l d ( : r e g i o n , : i d = > " l e a d - r e g i o n " ) t e x t _ f i e l d ( : z i p , : i d = > " l e a d - z i p " ) l i n k ( : s a v e , : c s s = > " . s a v e " ) e n d
  11. Methods added by PageObject module d e f f i

    r s t _ n a m e @ b r o w s e r . t e x t _ f i e l d ( : i d = > " l e a d - f i r s t - n a m e " ) . v a l u e e n d d e f f i r s t _ n a m e = ( f i r s t _ n a m e ) @ b r o w s e r . t e x t _ f i e l d ( : i d = > " l e a d - f i r s t - n a m e " ) . s e t ( f i r s t _ n a m e ) e n d d e f f i r s t _ n a m e _ e l e m e n t @ b r o w s e r . t e x t _ f i e l d ( : i d = > " l e a d - f i r s t - n a m e " ) e n d d e f f i r s t _ n a m e ? @ b r o w s e r . t e x t _ f i e l d ( : i d = > " l e a d - f i r s t - n a m e " ) . e x i s t s ? e n d
  12. THEN - CHECKING EXPECTATION i t " C h e

    c k m o b i l e " d o e x p e c t ( o n ( L e a d P a g e ) . m o b i l e . t e x t ) . t o e q ( @ l e a d . m o b i l e ) e n d i t " C h e c k p h o n e " d o e x p e c t ( o n ( L e a d P a g e ) . p h o n e . t e x t ) . t o e q ( @ l e a d . p h o n e ) e n d i t " C h e c k e m a i l " d o e x p e c t ( o n ( L e a d P a g e ) . e m a i l . t e x t ) . t o e q ( @ l e a d . e m a i l ) e n d
  13. Lead Page c l a s s L e a

    d P a g e < A b s t r a c t P a g e i n c l u d e P a g e O b j e c t d i v ( : d e t a i l s , : i d = > " d e t a i l s " ) d e f m o b i l e l i s t _ i t e m _ w i t h _ l i n k _ a n d _ l a b e l ( " m o b i l e " ) e n d d e f p h o n e l i s t _ i t e m _ w i t h _ l i n k _ a n d _ l a b e l ( " w o r k " ) e n d d e f e m a i l l i s t _ i t e m _ w i t h _ l i n k _ a n d _ l a b e l ( " e m a i l " ) e n d p r i v a t e d e f l i s t _ i t e m _ w i t h _ l i n k _ a n d _ l a b e l ( l a b e l ) l i s t _ i t e m = d e t a i l s _ e l e m e n t . u n o r d e r e d _ l i s t _ e l e m e n t . l i s t _ i t e m _ e l e m e n t s . f i n d d o | i t e m | i t e m . l i n k _ e l e m e n t . e x i s t s ? & & i t e m . s p a n _ e l e m e n t ( : t e x t = > l a b e l ) . e x i s t s ? e n d l i s t _ i t e m . l i n k _ e l e m e n t e n d e n d
  14. Element is not attached to the page document Stale Element

    Reference Error r e q u i r e ' d e l e g a t e ' r e q u i r e ' p a g e - o b j e c t ' c l a s s E l e m e n t D e l e g a t o r < D e l e g a t o r d e f i n i t i a l i z e ( o b j ) s u p e r @ d e l e g a t e _ s d _ o b j = o b j e n d d e f m e t h o d _ m i s s i n g ( m , * a r g s , & b l o c k ) t r i e s = 0 b e g i n t r i e s + = 1 s u p e r r e s c u e S e l e n i u m : : W e b D r i v e r : : E r r o r : : S t a l e E l e m e n t R e f e r e n c e E r r o r t r i e s < 5 ? r e t r y : r a i s e e n d e n d d e f _ _ g e t o b j _ _ @ d e l e g a t e _ s d _ o b j e n d d e f _ _ s e t o b j _ _ ( o b j ) @ d e l e g a t e _ s d _ o b j = o b j e n d e n d
  15. Extending page object gem m o d u l e

    B a s e E l e m e n t E x t e n s i o n s d e f f i l l _ w i t h _ t e x t _ v i a _ j s ( t e x t , r e p e t i t i o n s = 1 ) s e l e c t o r = s e l f . e l e m e n t . i n s t a n c e _ v a r i a b l e _ g e t ( : @ d e l e g a t e _ s d _ o b j ) . i n s t a n c e _ v a r i a b l e _ g e r a i s e " O n l y : c s s s u p p o r t e d . " u n l e s s s e l e c t o r s c r i p t = % Q { v a r g e n e r a t e d T e x t = n e w A r r a y ( # { r e p e t i t i o n s } ) . j o i n ( ' # { t e x t } ' ) ; $ ( ' # { s e l e c t o r } ' ) . t e x t ( g e n e r a t e d T e x t ) ; $ ( ' # { s e l e c t o r } ' ) . f o c u s ( ) ; } C u r r e n t B r o w s e r . i n s t a n c e . e x e c u t e _ s c r i p t ( s c r i p t ) e n d e n d P a g e O b j e c t : : E l e m e n t s : : E l e m e n t . s e n d ( : i n c l u d e , B a s e E l e m e n t E x t e n s i o n s )