SlideShare a Scribd company logo
Абалов Николай
Головин Глеб
Автоматизация UI тестирования под
Windows и Windows Phone
2
Ручные
GUI
API
Интеграционные
Компонентные
Модульные
3
Web
Icons by Edward Boatman,Kelig Le Luron,Roy Martens,Daniel,Martin Jordan,Yorlmar Campos,Kelig Le Luron from http://thenounproject.com/
3
Icons by Edward Boatman,Kelig Le Luron,Roy Martens,Daniel,Martin Jordan,Yorlmar Campos,Kelig Le Luron from http://thenounproject.com/
State of the Union
4
forcedotcom/windowsphonedriver
5
5
5
6
TestStack/White
7
Selenium
“free and open protocol for testing that has become a defacto standard”
Appium
Selenium 2.0 → 3.0
W3C working draft 2013
JsonWireProtocol
JsonWireProtocol
over HTTP
WebDriver
Implementation
System under Test
Magic
8
HTTP/1.1	
  200	
  OK	
  
Content-­‐Type:	
  application/json;charset=UTF-­‐8	
  
Connection:	
  close	
  
!
{"sessionId":"AwesomeSession",	
  "status":0,	
  "value":"CodeFest"}
GET	
  http://127.0.0.1:9999/session/12345/element/2026335-­‐1/text	
  HTTP/1.1	
  
...	
  
Content-­‐Type:	
  application/json;charset=UTF-­‐8	
  
Connection:	
  close	
  
Accept:	
  application/json
Get element text (JSON Wire Example)
9
10
Open Source • Selenium • Awesome
Winium for Store Apps
11
12
JsonWireProtocol
over HTTP
Xde
API
Internal API
over HTTP
XDE
Automation
Server
Winium.StoreApps.
Driver
Ваши тесты
на Python,
C#, JS,...
Тестируемое
приложение
13
Быстрый старт
a. Готовим приложение
b. Пишем тесты
c. Поехали!
1. Добавляем NuGet пакет Winium.StoreApps.InnerServer
2. В MainPageOnLoaded	
  создаем и запускаем сервер
автоматизации
14
a. Подготовка приложения
#if	
  DEBUG	
  
	
  	
  	
  	
  AutomationServer.Instance.InitializeAndStart(Frame);	
  
#endif	
  //	
  DEBUG
3. Обеспечиваем testability (прописываем
идентификаторы и имена)
4. Собираем приложение и упаковываем его в appx
15
a. Подготовка приложения
Деплой и загрузка данных (python)
dc	
  =	
  {'deviceName':	
  'Emulator	
  8.1	
  WVGA	
  4	
  inch	
  512MB',

	
  	
  	
  	
  	
  	
  'app':	
  'C:YorAppUnderTest.appx',

	
  	
  	
  	
  	
  	
  'files':	
  {

	
  	
  	
  	
  	
  	
  	
  	
  {'C:AppFilesfile1.png':	
  'downloadfile1.png',

	
  	
  	
  	
  	
  	
  	
  	
  	
  'C:AppFilesfile2.png':	
  'downloadfile2.png'}

	
  	
  	
  	
  },

	
  	
  	
  	
  'debugConnectToRunningApp':	
  False}	
  
!
driver	
  =	
  Remote(command_executor=“http://localhost:9999”,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  desired_capabilities=dc)
16
Поиск элементов
17
id AutomationProperties.AutomationId
name AutomationProperties.Name
class name полное имя класса
tag name тоже, что и class name
xname x:Name
Winium Inspector
18
element	
  =	
  driver.find_element_by_id('MyTextBox')	
  
!
#	
  получение	
  значения	
  текстового	
  поля

element.text

#	
  'Send	
  me	
  some	
  keys'	
  
!
#	
  кликнуть	
  в	
  элемент	
  
element.click()	
  
!
#	
  ввести	
  строку

element.send_keys('Hello!'+Keys.ENTER)
Операции над элементами
19
Получение значений свойств
#	
  скаляры	
  и	
  строки

element.get_attribute('Width')

#	
  300	
  
!
#	
  вложенные	
  свойства	
  
element.get_attribute('DesiredSize.Width')

#	
  300	
  
!
#	
  прочие	
  свойства,	
  серилизуемые	
  в	
  JSON

element.get_attribute('DesiredSize')

#	
  '{"Width":300.0,"Height":114.0,"IsEmpty":false}'
20
#	
  flick	
  –	
  “провести”,	
  быстрое	
  движение	
  по	
  экрану

TouchActions(driver).flick_element(element,	
  0,	
  500,	
  100).perform()

!
#	
  scroll/swipe	
  –	
  “сдвинуть”,	
  движение	
  по	
  экран	
  без	
  отрыва

TouchActions(driver).scroll(200,200).perform()	
  
!
#	
  можно	
  сделать	
  свой	
  жест	
  
ActionChains(driver)	
  

.click_and_hold()	
  

.move_by_offset(100,	
  100)	
  

.release().perform()
Жесты
21
Дополнительные команд
#	
  использование	
  invoke	
  шаблонов	
  
app_bar_button	
  =	
  driver.find_element_by_id('GoAppBarButton')

driver.execute_script('automation:	
  invoke',	
  app_bar_button)



list_box	
  =	
  driver.find_element_by_id('MyListBox')

si	
  =	
  {'v':	
  'smallIncrement',	
  'count':	
  10}

driver.execute_script('automation:	
  scroll',	
  list_box,	
  si)	
  
!
#	
  задание	
  значения	
  свойства	
  (скаляры	
  и	
  строки)	
  
text_box	
  =	
  driver.find_element_by_id('MyTextBox')

driver.execute_script('attribute:	
  set',	
  text_box,	
  'Width',	
  10)

driver.execute_script('attribute:	
  set',	
  text_box,	
  'Background.Opacity',	
  0.3)
22
https://github.com/2gis/Winium.StoreApps/wiki/Supported-Commands
NewSession !
Close!
Quit!
GetPageSource!
FindElement!
FindElements!
FindChildElement!
FindChildElements!
Screenshot!
ExecuteScript!
ClickElement!
GetElementText!
GetElementAttribute!
IsElementDisplayed!
GetElementLocation!
SendKeysToElement!
GetWindowSize!
GoBack
MouseMoveTo!
MouseClick!
MouseDown!
MouseUp!
TouchSingleTap!
TouchScroll!
TouchFlick!
...!
23
Все команды
b. Пишем тесты
import	
  unittest

from	
  selenium.webdriver	
  import	
  Remote

!
class	
  TestMainPage(unittest.TestCase):

	
  	
  desired_capabilities	
  =	
  {"app":	
  "C:YorAppUnderTest.appx"}



	
  	
  def	
  setUp(self):

	
  	
  	
  	
  self.driver	
  =	
  Remote(command_executor="http://localhost:9999",

	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  desired_capabilities=self.desired_capabilities)



	
  	
  def	
  test_button_tap_should_set_textbox_content(self):

	
  	
  	
  	
  self.driver.find_element_by_id('SetButton').click()

	
  	
  	
  	
  assert	
  'CARAMBA'	
  ==	
  self.driver.find_element_by_id('MyTextBox').text



	
  	
  def	
  tearDown(self):

	
  	
  self.driver.quit() 24
c. Поехали!
1. Запускаем Winium.StoreApps.Driver.exe	
  

(релиз доступен на github)
2. Запускаем тесты и наслаждаемся магией
25
Demo
Winium.StoreApps VS 2GIS app
26
27
27
https://github.com/2gis/Winium.StoreApps
28
Winium for Desktop
& Cruciatus
29
30
Тестируемое
приложение
Рабочий столWinium.Cruciatus
UI Automation
Framework
31
Почему Winium.Cruciatus?
1. Достаточно Professional версии Visual Studio
2. Любой тестовый фреймворк (например NUnit)
3. Легко использовать
Пример использования Winium.Cruciatus
[Test]	
  
public	
  void	
  SetTextButtonTest()	
  
{	
  
	
  	
  var	
  window	
  =	
  CruciatusFactory.Root.FindElementByUid("MainWindow");	
  
	
  	
  var	
  textBox	
  =	
  window.FindElementByUid("TextBox");	
  
	
  	
  var	
  setButton	
  =	
  window.FindElementByUid("SetTextButton");	
  
!
	
  	
  textBox.SetText("NOT	
  CARAMBA");	
  
	
  	
  setButton.Click();	
  
!
	
  	
  Assert.AreEqual(textBox.Text(),	
  "CARAMBA");	
  
}
32
Demo
Winium.Cruciatus
33
34
34
https://github.com/2gis/Winium.Cruciatus
35
What about driver?
36
Ваши тесты
на Python,
C#, JS,...
JsonWireProtocol
over HTTP
37
Winium.Desktop.
Driver
Тестируемое
приложение
Рабочий столWinium.Cruciatus
UI Automation
Framework
https://github.com/2gis/Winium.Desktop/wiki/Supported-Commands 38
NewSession !
Close!
Quit!
FindElement!
FindElements!
ClickElement!
Считаем на калькуляторе
39
План действий:
1. Запускаем калькулятор
2. Выбираем инженерный режим
3. Считаем "2^8"
4. Закрываем калькулятор
#	
  запускаем	
  калькулятор	
  
driver	
  =	
  Remote(command_executor='http://localhost:9999',

	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  desired_capabilities={'app':	
  'C:/windows/system32/calc.exe'})	
  


window	
  =	
  driver.find_element_by_class_name('CalcFrame')	
  	
  	
  #	
  находим	
  его	
  окно

view_menu_item	
  =	
  window.find_element_by_name('View')	
  	
  	
  	
  	
  	
  #	
  и	
  меню	
  “Вид”	
  
Считаем на калькуляторе (python)
40
#	
  запускаем	
  калькулятор	
  
driver	
  =	
  Remote(command_executor='http://localhost:9999',

	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  desired_capabilities={'app':	
  'C:/windows/system32/calc.exe'})	
  


window	
  =	
  driver.find_element_by_class_name('CalcFrame')	
  	
  	
  #	
  находим	
  его	
  окно

view_menu_item	
  =	
  window.find_element_by_name('View')	
  	
  	
  	
  	
  	
  #	
  и	
  меню	
  “Вид”	
  


view_menu_item.click()	
  	
  #	
  раскрываем	
  меню

view_menu_item.find_element_by_name('Scientific').click()	
  #	
  выбираем	
  режим	
  
Считаем на калькуляторе (python)
41
#	
  запускаем	
  калькулятор	
  
driver	
  =	
  Remote(command_executor='http://localhost:9999',

	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  desired_capabilities={'app':	
  'C:/windows/system32/calc.exe'})	
  


window	
  =	
  driver.find_element_by_class_name('CalcFrame')	
  	
  	
  #	
  находим	
  его	
  окно

view_menu_item	
  =	
  window.find_element_by_name('View')	
  	
  	
  	
  	
  	
  #	
  и	
  меню	
  “Вид”	
  


view_menu_item.click()	
  	
  #	
  раскрываем	
  меню

view_menu_item.find_element_by_name('Scientific').click()	
  #	
  выбираем	
  режим	
  


window.find_element_by_id('132').click()	
  	
  #	
  2

window.find_element_by_id('97').click()	
  	
  	
  #	
  ^

window.find_element_by_id('138').click()	
  	
  #	
  8

window.find_element_by_id('121').click()	
  	
  #	
  =	
  
Считаем на калькуляторе (python)
42
#	
  запускаем	
  калькулятор	
  
driver	
  =	
  Remote(command_executor='http://localhost:9999',

	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  desired_capabilities={'app':	
  'C:/windows/system32/calc.exe'})	
  


window	
  =	
  driver.find_element_by_class_name('CalcFrame')	
  	
  	
  #	
  находим	
  его	
  окно

view_menu_item	
  =	
  window.find_element_by_name('View')	
  	
  	
  	
  	
  	
  #	
  и	
  меню	
  “Вид”	
  


view_menu_item.click()	
  	
  #	
  раскрываем	
  меню

view_menu_item.find_element_by_name('Scientific').click()	
  #	
  выбираем	
  режим	
  


window.find_element_by_id('132').click()	
  	
  #	
  2

window.find_element_by_id('97').click()	
  	
  	
  #	
  ^

window.find_element_by_id('138').click()	
  	
  #	
  8

window.find_element_by_id('121').click()	
  	
  #	
  =	
  


driver.close()	
  	
  #	
  закрываем	
  калькулятор
Считаем на калькуляторе (python)
43
Считаем на калькуляторе (c#)
var	
  dc	
  =	
  new	
  DesiredCapabilities();

dc.SetCapability("app",	
  @"C:/windows/system32/calc.exe");

var	
  driver	
  =	
  new	
  RemoteWebDriver(new	
  Uri("http://localhost:9999"),	
  dc);



var	
  window	
  =	
  driver.FindElementByClassName("CalcFrame");	
  	
  //	
  находим	
  его	
  окно

var	
  viewMenuItem	
  =	
  window.FindElement(By.Name("View"));	
  	
  	
  //	
  и	
  меню	
  “Вид”

!
viewMenuItem.Click();	
  //	
  раскрываем	
  меню

viewMenuItem.FindElement(By.Name("Scientific")).Click();	
  //	
  “Инженерный”	
  режим



window.FindElement(By.Id("132")).Click();	
  //	
  2

window.FindElement(By.Id("97")).Click();	
  	
  //	
  ^

window.FindElement(By.Id("138")).Click();	
  //	
  8

window.FindElement(By.Id("121")).Click();	
  //	
  =



driver.Close();	
  //	
  закрываем	
  калькулятор
44
Demo
Winium.Desktop VS Calculator
45
46
46
https://github.com/2gis/Winium.Desktop
47
Future
48
Спасибо
https://github.com/2gis/Winium
Головин Глеб
g.golovin@2gis.ru
Абалов Николай
n.abalov@2gis.ru
49

More Related Content

PPTX
Типичные ошибки начинающих писать тесты на WebDriver
Igor Khrol
 
PPTX
Selenium vs AJAX
Alexei Barantsev
 
PPT
Alexander manuhin selenium_php_v2.0
matroskin1980
 
PPT
Опыт тестирования API САПР платформы
SQALab
 
PPTX
XPath локаторы в Selenium WebDriver
Илья Кожухов
 
PDF
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
SQALab
 
PPTX
Selenium: начало работы
Paul Stashevsky
 
PDF
Контроль качества верстки или как начать делать Makeup
Timophy Chaptykov
 
Типичные ошибки начинающих писать тесты на WebDriver
Igor Khrol
 
Selenium vs AJAX
Alexei Barantsev
 
Alexander manuhin selenium_php_v2.0
matroskin1980
 
Опыт тестирования API САПР платформы
SQALab
 
XPath локаторы в Selenium WebDriver
Илья Кожухов
 
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
SQALab
 
Selenium: начало работы
Paul Stashevsky
 
Контроль качества верстки или как начать делать Makeup
Timophy Chaptykov
 

What's hot (19)

PPTX
Selenium, а давай подождем?
SQALab
 
PDF
Автоматизация функционального тестирования REST API
Pavel Asanov
 
PDF
Инструментируй это
Roman Dvornov
 
PDF
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Омские ИТ-субботники
 
PDF
Тестируй это / Виктор Русакович (GP Solutions)
Ontico
 
PPTX
Автоматизация и Selenium IDE
ISsoft
 
PPTX
Особенности разработки API / Всеволод Шмыров (Яндекс)
Ontico
 
PPTX
Behat-trick: как мы внедряли BDD на наших проектах
SQALab
 
PDF
Реактивный двигатель вашего Android приложения
Matvey Malkov
 
PDF
Визуализация покрытия автоматизированными UI тестами
SQALab
 
PDF
BDD girls Battle: Cucumber VS. JBehave
SQALab
 
PPTX
Automation testing desktop applications
Алексей Стягайло
 
PDF
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
IT61
 
PPTX
Грязная автоматизация
SQALab
 
PPTX
автоматизация тестирования с помощью Selenium
vyacheslavmaslov
 
PDF
Grail: шаги для ваших Python-тестов
CodeFest
 
PPTX
Оценка качества автотестов
SQALab
 
PPTX
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Andrey Rebrov
 
PPTX
Selenium: приемы работы
Paul Stashevsky
 
Selenium, а давай подождем?
SQALab
 
Автоматизация функционального тестирования REST API
Pavel Asanov
 
Инструментируй это
Roman Dvornov
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Омские ИТ-субботники
 
Тестируй это / Виктор Русакович (GP Solutions)
Ontico
 
Автоматизация и Selenium IDE
ISsoft
 
Особенности разработки API / Всеволод Шмыров (Яндекс)
Ontico
 
Behat-trick: как мы внедряли BDD на наших проектах
SQALab
 
Реактивный двигатель вашего Android приложения
Matvey Malkov
 
Визуализация покрытия автоматизированными UI тестами
SQALab
 
BDD girls Battle: Cucumber VS. JBehave
SQALab
 
Automation testing desktop applications
Алексей Стягайло
 
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
IT61
 
Грязная автоматизация
SQALab
 
автоматизация тестирования с помощью Selenium
vyacheslavmaslov
 
Grail: шаги для ваших Python-тестов
CodeFest
 
Оценка качества автотестов
SQALab
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Andrey Rebrov
 
Selenium: приемы работы
Paul Stashevsky
 
Ad

Similar to Автоматизация UI тестирования под Windows и Windows Phone (20)

PPTX
iOS and Android Mobile Test Automation
Andrii Dzynia
 
PDF
Mobile automation uamobile
UA Mobile
 
PPT
Selenium 2.0: обзор новых возможностей
Paul Stashevsky
 
PPT
Appium для народа
SQALab
 
PPTX
Адаптивный веб-дизайн на практике (Антон Епрев)
Ontico
 
PPTX
automation is iOS development
Ivan Trifonov
 
PDF
Зачем нужен JavaScript в iOS-приложениях. Евгений Дымов
Yandex
 
PDF
FPUG Dzyga presentation
Ivan Filimonov
 
PDF
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Глеб Тарасов
 
PPTX
Selenide puzzlers @ devclub.eu
Andrei Solntsev
 
PPTX
End-2-End UI автоматизация в мобильном приложении. Наша реализация
SQALab
 
PPT
Всеволод Шмыров, Яндекс
Elena Voynova
 
PPTX
Java осень 2012 лекция 5
Technopark
 
PPTX
тестирование защищенности веб приложений
Zestranec
 
PPTX
Тестирование защищенности веб-приложений
SQALab
 
PPT
Руководство по приготовлению бутербродов из Selenium
Uladzimir Kryvenka
 
PDF
Превышаем скоросные лимиты с Angular 2
Oleksii Okhrymenko
 
PDF
Изоморфные приложения и Python - Виталий Глибин, Huntflow
it-people
 
PPT
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
CodeFest
 
PPT
Take more from Jquery
Magento Dev
 
iOS and Android Mobile Test Automation
Andrii Dzynia
 
Mobile automation uamobile
UA Mobile
 
Selenium 2.0: обзор новых возможностей
Paul Stashevsky
 
Appium для народа
SQALab
 
Адаптивный веб-дизайн на практике (Антон Епрев)
Ontico
 
automation is iOS development
Ivan Trifonov
 
Зачем нужен JavaScript в iOS-приложениях. Евгений Дымов
Yandex
 
FPUG Dzyga presentation
Ivan Filimonov
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Глеб Тарасов
 
Selenide puzzlers @ devclub.eu
Andrei Solntsev
 
End-2-End UI автоматизация в мобильном приложении. Наша реализация
SQALab
 
Всеволод Шмыров, Яндекс
Elena Voynova
 
Java осень 2012 лекция 5
Technopark
 
тестирование защищенности веб приложений
Zestranec
 
Тестирование защищенности веб-приложений
SQALab
 
Руководство по приготовлению бутербродов из Selenium
Uladzimir Kryvenka
 
Превышаем скоросные лимиты с Angular 2
Oleksii Okhrymenko
 
Изоморфные приложения и Python - Виталий Глибин, Huntflow
it-people
 
CodeFest 2013. Никонов Г. — Как мы разрабатываем приложения для Windows Phone...
CodeFest
 
Take more from Jquery
Magento Dev
 
Ad

More from CodeFest (20)

PDF
Alexander Graebe
CodeFest
 
PDF
Никита Прокопов
CodeFest
 
PPTX
Денис Баталов
CodeFest
 
PDF
Елена Гальцина
CodeFest
 
PDF
Александр Калашников
CodeFest
 
PDF
Ирина Иванова
CodeFest
 
PDF
Marko Berković
CodeFest
 
PDF
Денис Кортунов
CodeFest
 
PDF
Александр Зимин
CodeFest
 
PDF
Сергей Крапивенский
CodeFest
 
PDF
Сергей Игнатов
CodeFest
 
PDF
Николай Крапивный
CodeFest
 
PDF
Alexander Graebe
CodeFest
 
PDF
Вадим Смирнов
CodeFest
 
PDF
Константин Осипов
CodeFest
 
PDF
Raffaele Rialdi
CodeFest
 
PDF
Максим Пугачев
CodeFest
 
PDF
Rene Groeschke
CodeFest
 
PDF
Иван Бондаренко
CodeFest
 
PDF
Mete Atamel
CodeFest
 
Alexander Graebe
CodeFest
 
Никита Прокопов
CodeFest
 
Денис Баталов
CodeFest
 
Елена Гальцина
CodeFest
 
Александр Калашников
CodeFest
 
Ирина Иванова
CodeFest
 
Marko Berković
CodeFest
 
Денис Кортунов
CodeFest
 
Александр Зимин
CodeFest
 
Сергей Крапивенский
CodeFest
 
Сергей Игнатов
CodeFest
 
Николай Крапивный
CodeFest
 
Alexander Graebe
CodeFest
 
Вадим Смирнов
CodeFest
 
Константин Осипов
CodeFest
 
Raffaele Rialdi
CodeFest
 
Максим Пугачев
CodeFest
 
Rene Groeschke
CodeFest
 
Иван Бондаренко
CodeFest
 
Mete Atamel
CodeFest
 

Автоматизация UI тестирования под Windows и Windows Phone