Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

WATIR FireWatir OperaWatir SafariWatir

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

SELENIUM browser.keyPress browser.type browser.typeKeys

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

NativeDriver ios-driver

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

SELENIUM-WEBDRIVER API

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Есть ли элемент на странице 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?

Slide 26

Slide 26 text

Есть ли элемент на странице 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? Методы-обертки?

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

WATIR API

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

browser.header

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

browser.header.div.div.div.a

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

Ленивая инициализация 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

Slide 44

Slide 44 text

Admin

Slide 45

Slide 45 text

Admin User

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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"

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

Удобная работа с 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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

Checkers WATIR API

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

Alert API Cookies API Screenshot API WATIR API

Slide 70

Slide 70 text

Selenium-WebDriver + Watir =

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

UNDER THE HOOD

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

UNDER THE HOOD browser.text_field

Slide 79

Slide 79 text

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 =

Slide 80

Slide 80 text

СЕЙЧАС

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

ССЫЛКИ

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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