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

CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

Embed Size (px)

Citation preview

Page 1: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

Page 2: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

АЛЕКСЕЙ РОДИОНОВ

• 7+ лет в тестировании

• Контрибутор в Mozilla (WebQA)

• Разработчик Watir с июля 2012

Page 3: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WATIR

•Web application testing in Ruby

• 10 лет

• 750,000 загрузок

Page 4: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению
Page 5: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

Page 6: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

2002 2004 2006 2008 2010 2012

Page 7: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

2002 2004 2006 2008 2010 2012

Watir

Page 8: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WATIR

+ Управление через Windows OLE+ Стабильность

– Только IE– Только Windows– Только Ruby

Page 9: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WATIR

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

Page 10: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WATIR

FireWatirOperaWatirSafariWatir

Page 11: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

2002 2004 2006 2008 2010 2012

WatirSelenium

Page 12: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

SELENIUM

+ Ядро использует JavaScript+ Кросс-браузерность

– Ограничение JavaScript песочницей– Нестабильность– Перегруженное API

+ Кросс-платформенность+ Поддержка разных языков (Java, PHP, Ruby и т.д.)

Page 13: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

SELENIUM

browser.keyPressbrowser.typebrowser.typeKeys

Page 14: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

SELENIUM

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

Page 15: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

2002 2004 2006 2008 2010 2012

WatirSelenium

WebDriver

Page 16: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WEBDRIVER

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

Page 17: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WebDriver API

WebDriver SPI

JSON

Браузер

Page 18: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

NativeDriverios-driver

Page 19: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

2002 2004 2006 2008 2010 2012

WatirSelenium

WebDriver

Selenium-WebDriver

Page 20: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

SELENIUM-WEBDRIVER API

Page 21: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

– Есть ли элемент на странице

SELENIUM-WEBDRIVER API

Page 22: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

SELENIUM-WEBDRIVER API

Page 23: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

Есть ли элемент на странице

SELENIUM-WEBDRIVER API

Page 24: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

Есть ли элемент на странице

browser.find_element id: "does-not-exist"#=> Selenium::WebDriver::Error::NoSuchElementError: Unable to locate element: {"method":"id","selector":"does-not-exist"}

SELENIUM-WEBDRIVER API

Page 25: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

Есть ли элемент на странице

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?

Page 26: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

Есть ли элемент на странице

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?Методы-обертки?

Page 27: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

CSS/XPath локаторы

SELENIUM-WEBDRIVER API

Page 28: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

CSS/XPath локаторы

browser.find_element css: ".div1 .div2 .div3"

SELENIUM-WEBDRIVER API

Page 29: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

CSS/XPath локаторы

browser.find_element css: ".div1 .div2 .div3"

SELENIUM-WEBDRIVER API

Конкатенация строк локаторов?

Page 30: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

CSS/XPath локаторы

browser.find_element css: ".div1 .div2 .div3"

SELENIUM-WEBDRIVER API

Конкатенация строк локаторов?Цепочки из find_element?

Page 31: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WATIR API

Page 32: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

WATIR API

Page 33: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WATIR API

browser.divbrowser.spanbrowser.buttonbrowser.imgbrowser.a

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

Page 34: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

browser.header

Page 35: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WATIR API

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

Page 36: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WATIR API

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

browser.div.spanbrowser.frame.abrowser.table.tbody.td

Page 37: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

browser.header.div.div.div.a

Page 38: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

Page 39: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

WATIR API

Page 40: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

browser.divs.each do |div| div.textend

WATIR API

Page 41: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

Page 42: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

WATIR API

Page 43: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

link = browser.a(class: "does-not-exist")link.exists? #=> falselink.click#=> Watir::Exception::UnknownObjectException: unable to locate element, using {:class=>"does-not-exist", :tag_name=>"a"}

WATIR API

Page 44: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

Admin

Page 45: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

Admin

User

Page 46: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

Admin

User

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

Page 47: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

Page 48: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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"

Page 49: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

WATIR API

Page 50: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

WATIR API

browser.button(id: "button").when_present.clickbrowser.text_field(id: "field").when_visible.set "watir"browser.img(id: "image").wait_while_present

Page 51: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

WATIR API

Page 52: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

WATIR API

browser.text_field label: "Email"browser.button text: "Submit"

Page 53: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

WATIR API

Page 54: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

browser.img class: "image", index: 3

WATIR API

Page 55: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

browser.img class: "image", index: 3

WATIR API

browser.find_element xpath: "(//img[@class='image'])[4]"

Page 56: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

WATIR API

Page 57: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

WATIR API

browser.div data_attr: "attr"

Page 58: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

WATIR API

Page 59: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

browser.a id: /job_\d+_name/

WATIR API

Page 60: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

Page 61: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

Page 62: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

def message browser.div(class: "flash_notice").textend

Page 63: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

def message browser.div(class: "flash_notice").textend

Новый дизайн

Page 64: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

def message browser.div(class: "flash_notice").textend

Новый дизайн

Page 65: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

def message browser.div(class: /(flash_|b-)notice/).textend

Новый дизайн

Page 66: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

Checkers

WATIR API

Page 67: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

Checkers

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

WATIR API

Page 68: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

Checkers

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

WATIR API

Page 69: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

Alert APICookies API

Screenshot API

WATIR API

Page 70: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

Selenium-WebDriver+

Watir=

Page 71: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

Watir-WebDriverthe most elegant way to use webdriver in ruby

Page 72: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WebDriver API

WebDriver SPI

JSON

Браузер

Page 73: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WebDriver API

WebDriver SPI

JSON

Браузер

Watir API

Page 74: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

UNDER THE HOOD

Page 75: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WebIDLhttps://github.com/jarib/webidl

Парсер Interface Description Language игенератор Ruby-кода

Обеспечивает поддержку W3C спецификаций

UNDER THE HOOD

Page 76: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WatirSpechttps://github.com/watir/watirspec

Набор интеграционных тестов, описывающих ипроверяющих Watir API

UNDER THE HOOD

Page 77: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

UNDER THE HOOD

Page 78: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

UNDER THE HOOD

browser.text_field

Page 79: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

=

Page 80: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

СЕЙЧАС

Page 81: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

СЕЙЧАС

Watir-Classic+

Watir-WebDriver

Page 82: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

СЕЙЧАС

Watir-Classic+

Watir-WebDriver=

Watir 4

Page 83: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

WATIR 4

Watir::Browser.new :internet_explorerWatir::Browser.new :firefoxWatir::Browser.new :chromeWatir::Browser.new :phantomjs

Page 84: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

Page 85: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

Легкость

Page 86: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

ЛегкостьСкорость

Page 87: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

ЛегкостьСкоростьПоддержка

Page 88: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

ЛегкостьСкоростьПоддержкаПонимание

Page 89: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

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

ЛегкостьСкоростьПоддержкаПониманиеWebDriver

Page 90: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

ССЫЛКИ

Page 92: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

ССЫЛКИ

http://watir.comhttp://watirwebdriver.com

Page 93: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

ССЫЛКИ

http://watir.comhttp://watirwebdriver.com

http:://groups.google.com/group/watir-general

Page 94: CodeFest 2013. Родионов А. — От Selenium к Watir — путь к просветлению

ССЫЛКИ

http://watir.comhttp://watirwebdriver.com

http:://groups.google.com/group/watir-generalhttp://github.com/watir