CodeFest 2013. Родионов А. — От Selenium к Watir — путь к...

Post on 22-Jun-2015

828 views 3 download

Tags:

Transcript of CodeFest 2013. Родионов А. — От Selenium к Watir — путь к...

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

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

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

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

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

WATIR

•Web application testing in Ruby

• 10 лет

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

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

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

2002 2004 2006 2008 2010 2012

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

2002 2004 2006 2008 2010 2012

Watir

WATIR

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

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

WATIR

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

WATIR

FireWatirOperaWatirSafariWatir

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

2002 2004 2006 2008 2010 2012

WatirSelenium

SELENIUM

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

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

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

SELENIUM

browser.keyPressbrowser.typebrowser.typeKeys

SELENIUM

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

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

2002 2004 2006 2008 2010 2012

WatirSelenium

WebDriver

WEBDRIVER

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

WebDriver API

WebDriver SPI

JSON

Браузер

NativeDriverios-driver

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

2002 2004 2006 2008 2010 2012

WatirSelenium

WebDriver

Selenium-WebDriver

SELENIUM-WEBDRIVER API

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

SELENIUM-WEBDRIVER API

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

SELENIUM-WEBDRIVER API

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

SELENIUM-WEBDRIVER API

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

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

SELENIUM-WEBDRIVER API

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

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?

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

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

CSS/XPath локаторы

SELENIUM-WEBDRIVER API

CSS/XPath локаторы

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

SELENIUM-WEBDRIVER API

CSS/XPath локаторы

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

SELENIUM-WEBDRIVER API

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

CSS/XPath локаторы

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

SELENIUM-WEBDRIVER API

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

WATIR API

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

WATIR API

WATIR API

browser.divbrowser.spanbrowser.buttonbrowser.imgbrowser.a

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

browser.header

WATIR API

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

WATIR API

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

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

browser.header.div.div.div.a

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

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

WATIR API

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

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

WATIR API

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

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

WATIR API

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

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

Admin

Admin

User

Admin

User

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

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

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"

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

WATIR API

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

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

WATIR API

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

WATIR API

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

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

WATIR API

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

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

WATIR API

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

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

WATIR API

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

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

WATIR API

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

WATIR API

browser.div data_attr: "attr"

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

WATIR API

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

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

WATIR API

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

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

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

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

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

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

Новый дизайн

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

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

Новый дизайн

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

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

Новый дизайн

Checkers

WATIR API

Checkers

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

WATIR API

Checkers

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

WATIR API

Alert APICookies API

Screenshot API

WATIR API

Selenium-WebDriver+

Watir=

Watir-WebDriverthe most elegant way to use webdriver in ruby

WebDriver API

WebDriver SPI

JSON

Браузер

WebDriver API

WebDriver SPI

JSON

Браузер

Watir API

UNDER THE HOOD

WebIDLhttps://github.com/jarib/webidl

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

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

UNDER THE HOOD

WatirSpechttps://github.com/watir/watirspec

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

UNDER THE HOOD

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

UNDER THE HOOD

UNDER THE HOOD

browser.text_field

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

=

СЕЙЧАС

СЕЙЧАС

Watir-Classic+

Watir-WebDriver

СЕЙЧАС

Watir-Classic+

Watir-WebDriver=

Watir 4

WATIR 4

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

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

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

Легкость

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

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

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

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

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

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

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

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

ССЫЛКИ

ССЫЛКИ

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

ССЫЛКИ

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

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

ССЫЛКИ

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

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