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

From Selenium to Watir

From Selenium to Watir

Talk from CodeFest 2013 comparing Watir and Selenium (Russian)
http://2013.codefest.ru/doklad/24

Alex Rodionov

March 30, 2013
Tweet

More Decks by Alex Rodionov

Other Decks in Technology

Transcript

  1. ОТ SELENIUM К WATIR
    ПУТЬ К ПРОСВЕТЛЕНИЮ

    View Slide

  2. АЛЕКСЕЙ РОДИОНОВ
    • 7+ лет в тестировании
    • Контрибутор в Mozilla (WebQA)
    • Разработчик Watir с июля 2012

    View Slide

  3. WATIR
    • Web application testing in Ruby
    • 10 лет
    • 750,000 загрузок

    View Slide

  4. View Slide

  5. СИСТЕМЫ АВТОМАТИЗАЦИИ БРАУЗЕРОВ

    View Slide

  6. СИСТЕМЫ АВТОМАТИЗАЦИИ БРАУЗЕРОВ
    2002 2004 2006 2008 2010 2012

    View Slide

  7. СИСТЕМЫ АВТОМАТИЗАЦИИ БРАУЗЕРОВ
    2002 2004 2006 2008 2010 2012
    Watir

    View Slide

  8. WATIR
    + Управление через Windows OLE
    + Стабильность
    – Только IE
    – Только Windows
    – Только Ruby

    View Slide

  9. WATIR
    browser.goto "http://www.google.com"
    browser.text_field(:name, "q").value = "Watir"
    browser.button(:name, "btnG").click

    View Slide

  10. WATIR
    FireWatir
    OperaWatir
    SafariWatir

    View Slide

  11. СИСТЕМЫ АВТОМАТИЗАЦИИ БРАУЗЕРОВ
    2002 2004 2006 2008 2010 2012
    Watir
    Selenium

    View Slide

  12. SELENIUM
    + Ядро использует JavaScript
    + Кросс-браузерность
    – Ограничение JavaScript песочницей
    – Нестабильность
    – Перегруженное API
    + Кросс-платформенность
    + Поддержка разных языков (Java, PHP, Ruby и т.д.)

    View Slide

  13. SELENIUM
    browser.keyPress
    browser.type
    browser.typeKeys

    View Slide

  14. SELENIUM
    browser.open "http://www.google.com"
    browser.type "name=q", "Selenium"
    browser.click "name=btnG", :wait_for => :page

    View Slide

  15. СИСТЕМЫ АВТОМАТИЗАЦИИ БРАУЗЕРОВ
    2002 2004 2006 2008 2010 2012
    Watir
    Selenium
    WebDriver

    View Slide

  16. WEBDRIVER
    + Эмуляция действий пользователя (native events)
    + Кросс-браузерность
    + Кросс-платформенность
    + Поддержка разных языков (Java, PHP, Ruby и т.д.)
    + Объектно-ориентированное API

    View Slide

  17. WebDriver API
    WebDriver SPI
    JSON
    Браузер

    View Slide

  18. NativeDriver
    ios-driver

    View Slide

  19. СИСТЕМЫ АВТОМАТИЗАЦИИ БРАУЗЕРОВ
    2002 2004 2006 2008 2010 2012
    Watir
    Selenium
    WebDriver
    Selenium-WebDriver

    View Slide

  20. SELENIUM-WEBDRIVER API

    View Slide

  21. – Есть ли элемент на странице
    SELENIUM-WEBDRIVER API

    View Slide

  22. – Есть ли элемент на странице
    – Строки CSS/XPath локаторов
    SELENIUM-WEBDRIVER API

    View Slide

  23. Есть ли элемент на странице
    SELENIUM-WEBDRIVER API

    View Slide

  24. Есть ли элемент на странице
    browser.find_element id: "does-not-exist"
    #=> Selenium::WebDriver::Error::NoSuchElementError: Unable to
    locate element: {"method":"id","selector":"does-not-exist"}
    SELENIUM-WEBDRIVER API

    View Slide

  25. Есть ли элемент на странице
    browser.find_element id: "does-not-exist"
    #=> Selenium::WebDriver::Error::NoSuchElementError: Unable to
    locate element: {"method":"id","selector":"does-not-exist"}
    SELENIUM-WEBDRIVER API
    Monkey patch?

    View Slide

  26. Есть ли элемент на странице
    browser.find_element id: "does-not-exist"
    #=> Selenium::WebDriver::Error::NoSuchElementError: Unable to
    locate element: {"method":"id","selector":"does-not-exist"}
    SELENIUM-WEBDRIVER API
    Monkey patch?
    Методы-обертки?

    View Slide

  27. CSS/XPath локаторы
    SELENIUM-WEBDRIVER API

    View Slide

  28. CSS/XPath локаторы
    browser.find_element css: ".div1 .div2 .div3"
    SELENIUM-WEBDRIVER API

    View Slide

  29. CSS/XPath локаторы
    browser.find_element css: ".div1 .div2 .div3"
    SELENIUM-WEBDRIVER API
    Конкатенация строк локаторов?

    View Slide

  30. CSS/XPath локаторы
    browser.find_element css: ".div1 .div2 .div3"
    SELENIUM-WEBDRIVER API
    Конкатенация строк локаторов?
    Цепочки из find_element?

    View Slide

  31. WATIR API

    View Slide

  32. Имя метода = название тэга
    WATIR API

    View Slide

  33. WATIR API
    browser.div
    browser.span
    browser.button
    browser.img
    browser.a
    Имя метода = название тэга

    View Slide

  34. browser.header

    View Slide

  35. WATIR API
    Сохранение DOM иерархии

    View Slide

  36. WATIR API
    Сохранение DOM иерархии
    browser.div.span
    browser.frame.a
    browser.table.tbody.td

    View Slide

  37. browser.header.div.div.div.a

    View Slide

  38. browser.header.a(class: 'b-logo__image')

    View Slide

  39. Коллекции элементов
    WATIR API

    View Slide

  40. Коллекции элементов
    browser.divs.each do |div|
    div.text
    end
    WATIR API

    View Slide

  41. browser.table.trs.map do |tr|
    tr.td(index: 2).text
    end
    #=> ["$500.00", "$5,600.00"]

    View Slide

  42. Ленивая инициализация
    WATIR API

    View Slide

  43. Ленивая инициализация
    link = browser.a(class: "does-not-exist")
    link.exists? #=> false
    link.click
    #=> Watir::Exception::UnknownObjectException: unable to locate
    element, using {:class=>"does-not-exist", :tag_name=>"a"}
    WATIR API

    View Slide

  44. Admin

    View Slide

  45. Admin
    User

    View Slide

  46. Admin
    User
    def project
    {
    user: project_div.span(class: "user").text,
    job: project_div.span(class: "job").text,
    }
    end

    View Slide

  47. Admin
    User
    def project
    {
    user: project_div.span(class: "user").text,
    job: project_div.span(class: "job").text,
    change_link: project_div.a(text: "Change Commitment")
    }
    end

    View Slide

  48. Admin
    User
    def project
    {
    user: project_div.span(class: "user").text,
    job: project_div.span(class: "job").text,
    change_link: project_div.a(text: "Change Commitment")
    }
    end
    project[:change_link].click #=> Admin: "Ok"
    project[:change_link].click #=> User: "UnknownObjectException"

    View Slide

  49. Удобная работа с Ajax
    WATIR API

    View Slide

  50. Удобная работа с Ajax
    WATIR API
    browser.button(id: "button").when_present.click
    browser.text_field(id: "field").when_visible.set "watir"
    browser.img(id: "image").wait_while_present

    View Slide

  51. Поддержка “текстовых” локаторов
    WATIR API

    View Slide

  52. Поддержка “текстовых” локаторов
    WATIR API
    browser.text_field label: "Email"
    browser.button text: "Submit"

    View Slide

  53. Множественные локаторы
    WATIR API

    View Slide

  54. Множественные локаторы
    browser.img class: "image", index: 3
    WATIR API

    View Slide

  55. Множественные локаторы
    browser.img class: "image", index: 3
    WATIR API
    browser.find_element xpath: "(//img[@class='image'])[4]"

    View Slide

  56. Кастомные аттрибуты
    WATIR API

    View Slide

  57. Кастомные аттрибуты
    WATIR API
    browser.div data_attr: "attr"

    View Slide

  58. Регулярные выражения в локаторах
    WATIR API

    View Slide

  59. Регулярные выражения в локаторах
    browser.a id: /job_\d+_name/
    WATIR API

    View Slide

  60. Старый дизайн

    View Slide

  61. Старый дизайн

    View Slide

  62. Старый дизайн
    def message
    browser.div(class: "flash_notice").text
    end

    View Slide

  63. Старый дизайн
    def message
    browser.div(class: "flash_notice").text
    end
    Новый дизайн

    View Slide

  64. Старый дизайн
    def message
    browser.div(class: "flash_notice").text
    end
    Новый дизайн

    View Slide

  65. Старый дизайн
    def message
    browser.div(class: /(flash_|b-)notice/).text
    end
    Новый дизайн

    View Slide

  66. Checkers
    WATIR API

    View Slide

  67. Checkers
    browser.add_checker do |page|
    if page.text.include?("Server Error")
    raise TestError, "Application exception!"
    end
    end
    WATIR API

    View Slide

  68. Checkers
    1. При переходе по URL
    2. При обновлении страницы
    3. При клике по элементу
    WATIR API

    View Slide

  69. Alert API
    Cookies API
    Screenshot API
    WATIR API

    View Slide

  70. Selenium-WebDriver
    +
    Watir
    =

    View Slide

  71. Watir-WebDriver
    the most elegant way to use webdriver in ruby

    View Slide

  72. WebDriver API
    WebDriver SPI
    JSON
    Браузер

    View Slide

  73. WebDriver API
    WebDriver SPI
    JSON
    Браузер
    Watir API

    View Slide

  74. UNDER THE HOOD

    View Slide

  75. WebIDL
    https://github.com/jarib/webidl
    Парсер Interface Description Language и
    генератор Ruby-кода
    Обеспечивает поддержку W3C спецификаций
    UNDER THE HOOD

    View Slide

  76. WatirSpec
    https://github.com/watir/watirspec
    Набор интеграционных тестов, описывающих и
    проверяющих Watir API
    UNDER THE HOOD

    View Slide

  77. Конструктор XPath запросов
    Конструктор CSS запросов
    UNDER THE HOOD

    View Slide

  78. UNDER THE HOOD
    browser.text_field

    View Slide

  79. UNDER THE HOOD
    .//input[not(@type) or (translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='file' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='radio' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='checkbox' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='submit' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='reset' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='image' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='button' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='hidden' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='datetime' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='date' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='month' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='week' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='time' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='datetime-local' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='range' and
    translate(@type,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')!='color')]
    browser.text_field
    =

    View Slide

  80. СЕЙЧАС

    View Slide

  81. СЕЙЧАС
    Watir-Classic
    +
    Watir-WebDriver

    View Slide

  82. СЕЙЧАС
    Watir-Classic
    +
    Watir-WebDriver
    =
    Watir 4

    View Slide

  83. WATIR 4
    Watir::Browser.new :internet_explorer
    Watir::Browser.new :firefox
    Watir::Browser.new :chrome
    Watir::Browser.new :phantomjs

    View Slide

  84. ПРОСВЕТЛЕНИЕ?

    View Slide

  85. ПРОСВЕТЛЕНИЕ?
    Легкость

    View Slide

  86. ПРОСВЕТЛЕНИЕ?
    Легкость
    Скорость

    View Slide

  87. ПРОСВЕТЛЕНИЕ?
    Легкость
    Скорость
    Поддержка

    View Slide

  88. ПРОСВЕТЛЕНИЕ?
    Легкость
    Скорость
    Поддержка
    Понимание

    View Slide

  89. ПРОСВЕТЛЕНИЕ?
    Легкость
    Скорость
    Поддержка
    Понимание
    WebDriver

    View Slide

  90. ССЫЛКИ

    View Slide

  91. ССЫЛКИ
    http://watir.com

    View Slide

  92. ССЫЛКИ
    http://watir.com
    http://watirwebdriver.com

    View Slide

  93. ССЫЛКИ
    http://watir.com
    http://watirwebdriver.com
    http:://groups.google.com/group/watir-general

    View Slide

  94. ССЫЛКИ
    http://watir.com
    http://watirwebdriver.com
    http:://groups.google.com/group/watir-general
    http://github.com/watir

    View Slide

  95. ?
    @p0deje
    [email protected]
    github.com/p0deje

    View Slide