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

Making cross-browser tests with Webdriver

Avatar for nwlunatic nwlunatic
November 09, 2013

Making cross-browser tests with Webdriver

Avatar for nwlunatic

nwlunatic

November 09, 2013

Other Decks in Programming

Transcript

  1. Обо мне • В 2ГИС 1+ год • Команда автоматизации

    тестрования • Работал над инструменами тестирования для всех внешних web- проектов 2
  2. О чем будет • Откуда проблемы кроссбраузерности? • Примеры проблем

    кроссбраузерности • Решение - фреймворк • Практические рекомендации 3
  3. Webdriver Local End The WebDriver Wire Protocol (Json Wire Protocol)

    https://code.google.com/p/selenium/wiki/JsonWireProtocol 6
  4. О чем будет • Откуда проблемы кроссбраузерности? • Примеры проблем

    кроссбраузерности • Решение - фреймворк • Практические рекомендации 10
  5. Click 1. В центр элемента 2. Viewport содержит элемент •

    MAY: scrollIntoView 3. Должен быть видим* WebDriver W3C Clicking http://www.w3.org/TR/webdriver/#clicking 12
  6. Click: все хорошо? Chrome OK Firefox OK Opera OK Internet

    Explorer OK клик в желтый div 13
  7. Click: а так? Chrome FAIL Firefox OK Opera OK Internet

    Explorer NOTHING клик в желтый div 14
  8. Click: или даже так? Chrome FAIL Firefox OK Opera OK

    Internet Explorer NOTHING клик в желтый div 15
  9. Дождаться элемента d r i v e r . i

    m p l i c i t l y _ w a i t ( 5 ) s t a r t = t i m e . t i m e ( ) w h i l e n o t r e s u l t a n d t i m e . t i m e ( ) < s t a r t + t i m e o u t : t r y : r e s u l t = d r i v e r . f i n d _ e l e m e n t _ b y _ i d ( " i d " ) e x c e p t : p a s s 0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 22
  10. JQuery click s c r i p t = "

    a r g u m e n t s [ 0 ] . c l i c k ( ) ; " d r i v e r . e x e c u t e _ s c r i p t ( s c r i p t , e l e m e n t ) 0 1 . 0 2 . 25
  11. Поднимаем нужный маркер s c r i p t =

    " a r g u m e n t s [ 0 ] . s t y l e . z I n d e x + + ; " d r i v e r . e x e c u t e _ s c r i p t ( s c r i p t , m a r k e r ) m a r k e r . c l i c k ( ) 0 1 . 0 2 . 0 3 . 28
  12. Итог Расширяем свои возможности засчет: 1. Продуманных обработок ошибок 2.

    Инъекции JS Проблема Как не умереть от поддержки тестов с этим всем? 29
  13. О чем будет • Откуда проблемы кроссбраузерности? • Примеры проблем

    кроссбраузерности • Решение - фреймворк • Практические рекомендации 30
  14. Driver inheritance c l a s s T e s

    t D r i v e r ( R e m o t e ) : d e f _ _ i n i t _ _ ( s e l f , * a r g s , * * k w a r g s ) : s u p e r ( T e s t D r i v e r , s e l f ) . _ _ i n i t _ _ ( * a r g s , * * k w a r g s ) s e l f . _ b r o w s e r = N o n e 0 1 . 0 2 . 0 3 . 0 4 . 37
  15. WebElement inheritance c l a s s T e s

    t W e b E l e m e n t ( W e b E l e m e n t ) : d e f _ _ i n i t _ _ ( s e l f , d r i v e r,w e b _ e l e m e n t) : s e l f . _ _ d i c t _ _ . u p d a t e ( w e b _ e l e m e n t . _ _ d i c t _ _ ) s e l f . d r i v e r = d r i v e r 0 1 . 0 2 . 0 3 . 0 4 . 39
  16. find_element(s) override: with onload solution d e f f i

    n d _ e l e m e n t( s e l f , * a r g s , * * k w a r g s ) : t r y : w a i t _ f o r _ e l e m e n t _ a p p e a r ( * a r g s , * * k w a r g s ) e l e m e n t = s e l f . d r i v e r . f i n d _ e l e m e n t ( * a r g s , * * k w a r g s ) e x c e p t T i m e o u t E x c e p t i o n : r a i s e E l e m e n t N o t F o u n d ( k w a r g s [ " v a l u e " ] , k w a r g s [ " b y " ] ) r e t u r n T e s t W e b E l e m e n t ( s e l f . d r i v e r , e l e m e n t ) 0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 0 8 . 41
  17. TextWebElement extension c l a s s T e s

    t W e b E l e m e n t ( W e b E l e m e n t ) : * * * d e f f i n d _ e l e m e n t _ b y _ s i z z l e ( s e l f , s i z z l e _ s e l e c t o r ) : p a s s d e f j a v a s c r i p t _ c l i c k ( s e l f ) : p a s s 0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 0 8 . 43
  18. Page c l a s s P a g e

    ( o b j e c t ) : d e f _ _ i n i t _ _ ( s e l f , d r i v e r ) : s e l f . d r i v e r = d r i v e r s e l f . _ m a p = N o n e 0 1 . 0 2 . 0 3 . 0 4 . 51
  19. Components c l a s s M a p (

    T e s t W e b E l e m e n t ) : p a s s c l a s s M a r k e r ( T e s t W e b E l e m e n t ) : p a s s 0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 53
  20. map() @ p r o p e r t y

    d e f m a p ( s e l f ) : s e l e c t o r = M a p . s e l e c t o r s [ ' s e l f ' ] i f s e l f . _ m a p i s N o n e : e l e m e n t = s e l f . d r i v e r . # # # п е р е н о с f i n d _ e l e m e n t _ b y _ c s s _ s e l e c t o r ( s e l e c t o r ) s e l f . _ m a p = M a p ( s e l f . d r i v e r , e l e m e n t ) r e t u r n s e l f . _ m a p 0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 0 8 . 55
  21. Изолируем взаимодействие с локаторами c l a s s M

    a p ( T e s t W e b E l e m e n t ) : s e l e c t o r s = { s e l f ' : ' # m a p ' } c l a s s M a r k e r ( T e s t W e b E l e m e n t ) : s e l e c t o r s = { ' s e l f ' : ' . m a r k e r ' } 0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 56
  22. markers() c l a s s M a p (

    T e s t W e b E l e m e n t ) : . . . d e f g e t _ m a r k e r s ( s e l f ) : s e l e c t o r = M a r k e r . s e l e c t o r s [ ' s e l f ' ] e l e m e n t s = s e l f . # # # п е р е н о с f i n d _ e l e m e n t s _ b y _ c s s _ s e l e c t o r ( s e l e c t o r ) r e t u r n [ M a r k e r ( e l e m ) f o r e l e m i n e l e m e n t s ] 0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 58
  23. Итог Получили удобные* методы доступа к карте и маркерам *Удобно

    для нас, это: 1. Работа в контексте приложения, 2. Легче контролировать изменения локаторов. 59
  24. Определяем клик в маркер c l a s s M

    a r k e r ( T e s t W e b E l e m e n t ) : d e f _ o r i g i n a l _ c l i c k ( s e l f , * a r g s , * * k w a r g s ) : s u p e r ( M a r k e r , s e l f ) . c l i c k ( * a r g s , * * k w a r g s ) d e f c l i c k ( s e l f ) : s e l f . b r i n g _ t o _ f r o n t ( ) s e l f . _ o r i g i n a l _ c l i c k ( ) 0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 62
  25. Test Case " " " - Д е л а

    е м п о и с к - Н а к а р т е к л и к а е м в м а р к е р - Н а з в а н и е ф и р м ы в к о л л а у т е и щ е м в р е з у л ь т а т а х п о и с к а О Р : Н а з в а н и е ф и р м ы в к о л л у т е е с т ь в р е з у л ь т а т а х п о и с к а " " " 0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 0 6 . 0 7 . 66
  26. Test d e f t e s t _ f

    i r m c a l l o u t _ t i t l e _ i n _ f i r m c a r d s _ t i t l e s ( s e l f ) : s e l f . p a g e . s e a r c h B a r . c a t a l o g T a b . s e a r c h ( ' п и в о ' ) s e l f . p a g e . m a p . m a r k e r s [ 0 ] . c l i c k ( ) t i t l e = s e l f . p a g e . m a p . f i r m C a l l o u t . t i t l e s e l f . a s s e r t T r u e ( t i t l e i n s e l f . p a g e . s e a r c h R e s u l t s ) 0 1 . 0 2 . 0 3 . 0 4 . 0 5 . 67
  27. О чем будет • Откуда проблемы кроссбраузерности? • Примеры проблем

    кроссбраузерности • Решение - фреймворк • Практические рекомендации 72
  28. Статистика пользователей 2gis.ru Chrome 37,58 % Opera 23,49 % Firefox

    14,33 % Internet Explorer 9,99 % за период с 14 сентября по 14 октября 2013г 75
  29. 2gis.ru • Одностраничное приложение • И это очень много JS

    • А JS в разных браузерах...нужно тестировать 76
  30. О чем будет • Откуда проблемы кроссбраузерности? • Примеры проблем

    кроссбраузерности • Решение - фреймворк • Практические рекомендации 80