CodeFest 2013. Родионов А. — От Selenium к Watir — путь к...
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.com
ССЫЛКИ
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