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

D049f551aa71e6326c74002ac8e6788a?s=128

Alex Rodionov

March 30, 2013
Tweet

Transcript

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

  2. АЛЕКСЕЙ РОДИОНОВ • 7+ лет в тестировании • Контрибутор в

    Mozilla (WebQA) • Разработчик Watir с июля 2012
  3. WATIR • Web application testing in Ruby • 10 лет

    • 750,000 загрузок
  4. None
  5. СИСТЕМЫ АВТОМАТИЗАЦИИ БРАУЗЕРОВ

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

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

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

    IE – Только Windows – Только Ruby
  9. WATIR browser.goto "http://www.google.com" browser.text_field(:name, "q").value = "Watir" browser.button(:name, "btnG").click

  10. WATIR FireWatir OperaWatir SafariWatir

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

    Selenium
  12. SELENIUM + Ядро использует JavaScript + Кросс-браузерность – Ограничение JavaScript

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

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

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

    Selenium WebDriver
  16. WEBDRIVER + Эмуляция действий пользователя (native events) + Кросс-браузерность +

    Кросс-платформенность + Поддержка разных языков (Java, PHP, Ruby и т.д.) + Объектно-ориентированное API
  17. WebDriver API WebDriver SPI JSON Браузер

  18. NativeDriver ios-driver

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

    Selenium WebDriver Selenium-WebDriver
  20. SELENIUM-WEBDRIVER API

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

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

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

  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
  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?
  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? Методы-обертки?
  27. CSS/XPath локаторы SELENIUM-WEBDRIVER API

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

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

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

    строк локаторов? Цепочки из find_element?
  31. WATIR API

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

  33. WATIR API browser.div browser.span browser.button browser.img browser.a Имя метода =

    название тэга
  34. browser.header

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

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

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

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

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

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

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

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

  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
  44. Admin

  45. Admin User

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

    "job").text, } end
  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
  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"
  49. Удобная работа с Ajax WATIR API

  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
  51. Поддержка “текстовых” локаторов WATIR API

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

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

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

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

    xpath: "(//img[@class='image'])[4]"
  56. Кастомные аттрибуты WATIR API

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

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

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

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

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

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

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

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

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

  66. Checkers WATIR API

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

    exception!" end end WATIR API
  68. Checkers 1. При переходе по URL 2. При обновлении страницы

    3. При клике по элементу WATIR API
  69. Alert API Cookies API Screenshot API WATIR API

  70. Selenium-WebDriver + Watir =

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

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

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

  74. UNDER THE HOOD

  75. WebIDL https://github.com/jarib/webidl Парсер Interface Description Language и генератор Ruby-кода Обеспечивает

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

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

  78. UNDER THE HOOD browser.text_field

  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 =
  80. СЕЙЧАС

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

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

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

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

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

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

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

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

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

  90. ССЫЛКИ

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

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

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

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

  95. ? @p0deje p0deje@gmail.com github.com/p0deje