SlideShare a Scribd company logo
1 of 246
Download to read offline
ChromeDriver Jailbreak
Александр Баяндин
“ THIS IS THE
MOST POPULAR
DATING APP IN
THE WORLD
— Time
400KРегистраций
в день
5
Платформ
330MПользователей
1.8ч
Использование
в день
350MСообщений в
день
21M
DAU
54M
MAU
10MФотозагрузок
в день
О нас
400KРегистраций
в день
5
Платформ
330MПользователей
1.8ч
Использование
в день
350MСообщений в
день
21M
DAU
54M
MAU
10MФотозагрузок
в день
О нас
Платформы
✦ Desktop Web
4
Платформы
✦ Desktop Web
✦ iOS
4
Платформы
✦ Desktop Web
✦ iOS
✦ Android
4
Платформы
✦ Desktop Web
✦ iOS
✦ Android
✦ Windows Phone
4
Платформы
✦ Desktop Web
✦ iOS
✦ Android
✦ Windows Phone
✦ Mobile Web
4
Mobile Test Automation
Платформы
✦ Desktop Web
✦ iOS
✦ Android
✦ Windows Phone
✦ Mobile Web
4
Mobile Test Automation
Платформы
✦ Desktop Web
✦ iOS
✦ Android
✦ Windows Phone
✦ Mobile Web
4
Mobile Test Automation
Платформы
✦ Desktop Web
✦ iOS
✦ Android
✦ Windows Phone
✦ Mobile Web
4
Mobile
Test Automation
Team
Mobile Test Automation Team
✦ Ruby & Cucumber
6
Mobile Test Automation Team
✦ Ruby & Cucumber
✦ Calabash, Selenium & Winium.Mobile
6
Mobile Test Automation Team
✦ Ruby & Cucumber
✦ Calabash, Selenium & Winium.Mobile
✦ TeamCity
6
Mobile Test Automation Team
✦ Ruby & Cucumber
✦ Calabash, Selenium & Winium.Mobile
✦ TeamCity
✦ Кросс-платформенная автоматизация
6
7
Scenario
Кросс-платформенная
автоматизация
7
Scenario
Step
Кросс-платформенная
автоматизация
7
Step Definition
Scenario
Step
Кросс-платформенная
автоматизация
Page Objects
7
Step Definition
Scenario
Step
Кросс-платформенная
автоматизация
Page Objects
7
Step Definition
Scenario
Step
Кросс-платформенная
автоматизация
8
Step Definition
iOS POAndroid Page Objects MW PO WP PO
Scenario
Step
Кросс-платформенная
автоматизация
8
Step Definition
iOS POAndroid Page Objects MW PO WP PO
Scenario
Step
Calabash
Кросс-платформенная
автоматизация
8
Step Definition
iOS POAndroid Page Objects MW PO WP PO
Scenario
Step
Calabash Selenium
Кросс-платформенная
автоматизация
8
Step Definition
iOS POAndroid Page Objects MW PO WP PO
Scenario
Step
Calabash Selenium Winium.Mobile
Кросс-платформенная
автоматизация
Mobile Test Automation Team
✦ Ruby & Cucumber
✦ Calabash, Selenium & Winium.Mobile
✦ TeamCity
✦ Кросс-платформенная автоматизация
9
Mobile Test Automation Team
✦ Ruby & Cucumber
✦ Calabash, Selenium & Winium.Mobile
✦ TeamCity
✦ Кросс-платформенная автоматизация
✦ Мы клёвые !
9
Автоматизация
Процесс разработки
11
Процесс разработки
✦ Разработчик разрабатывает
11
Процесс разработки
✦ Разработчик разрабатывает
✦ Тестировщик тестирует
11
Процесс разработки
✦ Разработчик разрабатывает
✦ Тестировщик тестирует
✦ Пользователь пользуется
11
✦ Разработчик разрабатывает
✦ Тестировщик тестирует
✦ Пользователь пользуется
Процесс разработки
12
✦ Разработчик разрабатывает
✦ Тестировщик тестирует
✦ Пользователь пользуется
Процесс разработки
12
Автоматизация
тестирования
✦ Разработчик разрабатывает
✦ Тестировщик тестирует
✦ Пользователь пользуется
Процесс разработки
12
Автоматизация
тестирования
– Саша, у меня
падает тест
– В нетворке пусто
– Руками не
воспроизводится
Варианты ответа
16
Варианты ответа
✦ Остановить тест за шаг до падения, последний шаг
проделать вручную (с открытыми DevTools)
16
Варианты ответа
✦ Остановить тест за шаг до падения, последний шаг
проделать вручную (с открытыми DevTools)
✦ Поставить прокси
16
Варианты ответа
✦ Остановить тест за шаг до падения, последний шаг
проделать вручную (с открытыми DevTools)
✦ Поставить прокси
✦ ???
16
У нас же Chrome!
17
У нас же Chrome!
✦ ChromeDriver умеет Performance log
https://sites.google.com/a/chromium.org/chromedriver/logging/performance-log
У нас же Chrome!
http://www.softwareishard.com/har/viewer/
У нас же Chrome!
20
✦ ChromeDriver умеет Performance log
✦ Нужно конвертировать Performance log в HAR
https://github.com/woodsaj/chromedriver_har
woodsaj/chromedriver_har
✦ Конвертирует Performance log в HAR
22
woodsaj/chromedriver_har
✦ Конвертирует Performance log в HAR
✦ Написан на и для Go
22
woodsaj/chromedriver_har
23
RubyGo
woodsaj/chromedriver_har
GoRuby
24
woodsaj/chromedriver_har
GoRuby
Сохранить Performance log
в JSON файл
24
woodsaj/chromedriver_har
Go
Прочитать файл
Ruby
Сохранить Performance log
в JSON файл
24
woodsaj/chromedriver_har
Go
Прочитать файл
Десериализовать
Ruby
Сохранить Performance log
в JSON файл
24
woodsaj/chromedriver_har
Go
Прочитать файл
Десериализовать
Конвертировать в HAR
Ruby
Сохранить Performance log
в JSON файл
24
woodsaj/chromedriver_har
Go
Прочитать файл
Десериализовать
Конвертировать в HAR
Сохранить HAR файл
Ruby
Сохранить Performance log
в JSON файл
24
woodsaj/chromedriver_har
https://gist.github.com/bayandin/2645a367a7132b355ea25d372a481e84
Go
Прочитать файл
Десериализовать
Конвертировать в HAR
Сохранить HAR файл
Ruby
Сохранить Performance log
в JSON файл
Решение
✦ Включить Performance log в тестах
✦ Конвертировать Performance log в HAR
26
В Performance log
нет тела ответа
Как работает
драйвер
+------+ +------------+ +-------+
|Client|<------>| Driver |<------>|Browser|
+------+ +------------+ +-------+
30
+------+ +------------+ +-------+
|Client|<------>| Driver |<------>|Browser|
+------+ +------------+ +-------+
Selenium / test
30
+------+ +------------+ +-------+
|Client|<------>| Driver |<------>|Browser|
+------+ +------------+ +-------+
WebDriver
Protocol
Selenium / test
30
+------+ +------------+ +-------+
|Client|<------>| Driver |<------>|Browser|
+------+ +------------+ +-------+
WebDriver
Protocol
Protocol
Selenium / test
30
+------+ +------------+ +-------+
|Client|<------>| Driver |<------>|Browser|
+------+ +------------+ +-------+
WebDriver
Protocol
Chrome Debugging
Protocol
Selenium / test
31
ChromeDriver Chrome
+------+ +------------+ +-------+
|Client|<------>| Driver |<------>|Browser|
+------+ +------------+ +-------+
WebDriver
Protocol
Chrome Debugging
Protocol
Selenium / test
31
ChromeDriver Chrome
Chrome Debugging Protocol
✦ Реализован поверх WebSocket
32
Chrome Debugging Protocol
✦ Реализован поверх WebSocket
✦ Используется в Chrome DevTools
https://developer.chrome.com/devtools/docs/debugger-protocol
Тело ответа в DevTools
Network.getResponseBody
Returns content served for the given request.
PARAMETERS
requestId: RequestId
RETURN OBJECT
body: string
base64Encoded: boolean
https://chromedevtools.github.io/debugger-protocol-viewer/1-2/Network/#method-getResponseBody
Решение
✦ Включить Performance log в тестах
✦ Конвертировать Performance log в HAR
36
Решение
✦ Включить Performance log в тестах
✦ Получить тело ответа для всех запросов
✦ Конвертировать Performance log в HAR
37
Решение
✦ Включить Performance log в тестах
✦ Получить тело ответа для всех запросов
✦ Конвертировать Performance log в HAR
✦ Добавить ответы в HAR
37
+-+
+-+ +--------+ +------------+ |C|
|T|<---->|Selenium|<---->|ChromeDriver|<------->|h|
|e| +--------+ +------------+ |r|
|s| |o|
|t|<------------------------------------------->|m|
+-+ |e|
+-+
WebSocket
Connection
38
Возможно только одно
одновременное
подключениe
Chrome Debugging Protocol
https://developer.chrome.com/devtools/docs/debugger-protocol#simultaneous
+-+
+-+ +--------+ +------------+ |C|
|T|<---->|Selenium|<---->|ChromeDriver|<------->|h|
|e| +--------+ +------------+ |r|
|s| |o|
|t|<------------------------------------------->|m|
+-+ |e|
+-+
WebSocket
Connection
41
+-+
+-+ +--------+ +------------+ |C|
|T|<---->|Selenium|<---->|ChromeDriver|<------->|h|
|e| +--------+ +------------+ |r|
|s| |o|
|t|<------------------------------------------->|m|
+-+ |e|
+-+
WebSocket
Connection
/////
/////
41
Нужен прокси
+-+
+-+ +--------+ +------------+ |C|
|T|<---->|Selenium|<---->|ChromeDriver|<------->|h|
|e| +--------+ +------------+ |r|
|s| |o|
|t|<------------------------------------------->|m|
+-+ |e|
+-+
WebSocket
Connection
/////
/////
43
+-+ +-+
+-+ +--------+ +------------+ |P| |C|
|T|<---->|Selenium|<---->|ChromeDriver|<->|r| |h|
|e| +--------+ +------------+ |o|<->|r|
|s| |x| |o|
|t|<------------------------------------->|y| |m|
+-+ +-+ |e|
+-+
WebSocket
Connection
44
Как встроить прокси?
45
Как работает
драйвер. Часть 2
+-+
|C|
|h|
|r|
|o|
|m|
|e|
|D|
|r|
|i|
|v|
|e|
|r|
+-+
47
+-+
|C|
|h|
|r|
|o|
|m|
|e|
|D|
|r|
|i|
|v|
|e|
|r|
+-+
POST /session
47
+-+
|C|
|h|
|r|
|o|
|m|
|e|
|D|
|r|
|i|
|v|
|e|
|r|
+-+
POST /session
DesiredCapabilities
47
+-+
|C|
|h|
|r|
|o|
|m|
|e|
|D|
|r|
|i|
|v|
|e|
|r|
+-+
POST /session
DesiredCapabilities
chromeOptions
47
+-+
|C|
|h|
|r|
|o|
|m|
|e|
|D|
|r|
|i|
|v|
|e|
|r|
+-+
POST /session
DesiredCapabilities
chromeOptions
binary
47
+-+
|C|
|h|
|r|
|o|
|m|
|e|
|D|
|r|
|i|
|v|
|e|
|r|
+-+
POST /session
google-chrome
DesiredCapabilities
chromeOptions
binary
47
+-+
|C|
|h|
|r|
|o|
|m|
|e|
|D|
|r|
|i|
|v|
|e|
|r|
+-+
POST /session
google-chrome … --remote-debugging-port=X
DesiredCapabilities
chromeOptions
binary
48
+-+
|C|
|h|
|r|
|o|
|m|
|e|
|D|
|r|
|i|
|v|
|e|
|r|
+-+
POST /session
google-chrome … --remote-debugging-port=X
12000 < X < 13000
DesiredCapabilities
chromeOptions
binary
48
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| |m|
|i| |e|
|v| +-+
|e|
|r|
+-+
49
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| |m|
|i| |e|
|v| +-+
|e|
|r|
+-+
/json/version
49
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| |m|
|i| |e|
|v| +-+
|e|
|r|
+-+
/json/version
{
"Browser": "Chrome/54.0.2840.98",
"Protocol-Version": "1.2",
"User-Agent": "…",
"WebKit-Version": "537.36 (@8ee402c…ad)"
}
49
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| |m|
|i| |e|
|v| +-+
|e|
|r|
+-+
/json/list
/json/version
50
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| |m|
|i| |e|
|v| +-+
|e|
|r|
+-+
/json/list
[{
"id": "…",
"webSocketDebuggerUrl": "…",
"devtoolsFrontendUrl": "…",
…
},
…]
/json/version
50
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| |m|
|i| |e|
|v| +-+
|e|
|r|
+-+
ws://webSocketDebuggerUrl
/json/list
/json/version
51
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| |m|
|i| |e|
|v| +-+
|e|
|r|
+-+
ws://webSocketDebuggerUrl
/json/list
/json/version
set-up + chromeOptions
51
Как встроить прокси?
52
Как встроить прокси?
Использовать свой скрипт в binary в ChromeOptions.
52
+-+
|C|
|h|
|r|
|o|
|m|
|e|
|D|
|r|
|i|
|v|
|e|
|r|
+-+
POST /session
DesiredCapabilities
chromeOptions
binary
53
+-+
|C|
|h|
|r|
|o|
|m|
|e|
|D|
|r|
|i|
|v|
|e|
|r|
+-+
POST /session
chrome-wrapper
DesiredCapabilities
chromeOptions
binary
53
+-+
|C|
|h|
|r|
|o|
|m|
|e|
|D|
|r|
|i|
|v|
|e|
|r|
+-+
POST /session
chrome-wrapper … --remote-debugging-port=X
DesiredCapabilities
chromeOptions
binary
54
+-+
|C|
|h|
|r|
|o|
|m|
|e|
|D|
|r|
|i|
|v|
|e|
|r|
+-+
POST /session
chrome-wrapper … --remote-debugging-port=X
DesiredCapabilities
chromeOptions
binary
portX
54
+-+
|C|
|h|
|r|
|o|
|m|
|e|
|D|
|r|
|i|
|v|
|e|
|r|
+-+
POST /session
chrome-wrapper … --remote-debugging-port=X
DesiredCapabilities
chromeOptions
binary
portY
portX
54
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| +--------------+ |m|
|i| |DevTools Proxy| |e|
|v| +--------------+ +-+
|e|
|r|
+-+
55
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| +--------------+ |m|
|i| |DevTools Proxy| |e|
|v| +--------------+ +-+
|e|
|r|
+-+
/json/version
portX
55
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| +--------------+ |m|
|i| |DevTools Proxy| |e|
|v| +--------------+ +-+
|e|
|r|
+-+
/json/version
portX
portY
55
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| +--------------+ |m|
|i| |DevTools Proxy| |e|
|v| +--------------+ +-+
|e|
|r|
+-+
/json/version
portX
portY
55
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| +--------------+ |m|
|i| |DevTools Proxy| |e|
|v| +--------------+ +-+
|e|
|r|
+-+
/json/version
portX
portY
55
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| +--------------+ |m|
|i| |DevTools Proxy| |e|
|v| +--------------+ +-+
|e|
|r|
+-+
ws
ws
portX
portY
56
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| +--------------+ |m|
|i| |DevTools Proxy| |e|
|v| +--------------+ +-+
|e|
|r|
+-+
ws
ws
Tests
portX
portY
56
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| +--------------+ |m|
|i| |DevTools Proxy| |e|
|v| +--------------+ +-+
|e|
|r|
+-+
ws
ws
Tests
w
s
portXportX
portY
56
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| +--------------+ |m|
|i| |DevTools Proxy| |e|
|v| +--------------+ +-+
|e|
|r|
+-+
: 12000 < X < 13000
ws
ws
Tests
w
s
portXportX
portY
56
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| +--------------+ |m|
|i| |DevTools Proxy| |e|
|v| +--------------+ +-+
|e|
|r|
+-+
ws
wsw
s
Tests
portZportX
portY
57
Финальная логика
✦ Включить Performance log в тестах
✦ Получить тело ответа для всех запросов
✦ Конвертировать Performance log в HAR
✦ Добавить ответы в HAR
58
Финальная логика
✦ Передать chrome-wrapper в binary в ChromeOptions
✦ Включить Performance log в тестах
✦ Получить тело ответа для всех запросов
✦ Конвертировать Performance log в HAR
✦ Добавить ответы в HAR
59
Получение тела
ответа
> {
"id":0,
"method":"Network.getResponseBody",
"params":{ "requestId":"28781.18" }
}
61
< {
"id":0,
"error":{
"code":-32000,
"message":"No resource with given identifier found"
}
}
> {
"id":0,
"method":"Network.getResponseBody",
"params":{ "requestId":"28781.18" }
}
61
63
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| |m|
|i| |e|
|v| +-+
|e|
|r|
+-+
ws://webSocketDebuggerUrl
/json/list
/json/version
set-up + chromeOptions
64
+-+
|C|
|h|
|r| +-+
|o| |C|
|m| |h|
|e| |r|
|D| |o|
|r| |m|
|i| |e|
|v| +-+
|e|
|r|
+-+
ws://webSocketDebuggerUrl
/json/list
/json/version
set-up + chromeOptions
64
ChromeDriver set-up
65
{'id': 1, 'params': {}, 'method': 'Network.enable'}
{'id': 2, 'params': {}, 'method': 'Log.enable'}
{'id': 3, 'params': {}, 'method': 'Runtime.enable'}
{'id': 5, 'params': {}, 'method': 'Page.enable'}
ChromeDriver set-up
65
DevTools set-up
66
DevTools set-up
{'id': 1, 'method': 'Log.enable'}
{'id': 2, 'method': 'Runtime.enable'}
{'id': 3, 'method': 'Network.enable',
'params': {'maxResourceBufferSize': 5000000, 'maxTotalBufferSize': 10000000}}
{'id': 4, 'method': 'Page.enable'}
{'id': 6, 'method': 'Debugger.enable'}
{'id': 9, 'method': 'DOM.enable'}
{'id': 10, 'method': 'CSS.enable'}
{'id': 12, 'method': 'Worker.enable'}
{'id': 13, 'method': 'Profiler.enable'}
{'id': 15, 'method': 'ServiceWorker.enable'}
{'id': 23, 'method': 'Inspector.enable'}
66
DevTools set-up
{'id': 1, 'method': 'Log.enable'}
{'id': 2, 'method': 'Runtime.enable'}
{'id': 3, 'method': 'Network.enable',
'params': {'maxResourceBufferSize': 5000000, 'maxTotalBufferSize': 10000000}}
{'id': 4, 'method': 'Page.enable'}
{'id': 6, 'method': 'Debugger.enable'}
{'id': 9, 'method': 'DOM.enable'}
{'id': 10, 'method': 'CSS.enable'}
{'id': 12, 'method': 'Worker.enable'}
{'id': 13, 'method': 'Profiler.enable'}
{'id': 15, 'method': 'ServiceWorker.enable'}
{'id': 23, 'method': 'Inspector.enable'}
66
> {
"id":1,
"method":"Network.enable",
"params":{}
}
ChromeDriver
67
> {
"id":1,
"method":"Network.enable",
"params":{}
}
ChromeDriver
> {
"id":3,
"method":"Network.enable",
"params":{
"maxTotalBufferSize":10000000,
"maxResourceBufferSize":5000000
}
}
DevTools
67
Финальная логика
✦ Передать chrome-wrapper в binary в ChromeOptions
✦ Включить Performance log в тестах
✦ Получить тело ответа для всех запросов
✦ Конвертировать Performance log в HAR
✦ Добавить ответы в HAR
68
Финальная логика
✦ Передать chrome-wrapper.sh в binary в ChromeOptions
✦ Включить Performance log в тестах
✦ Отправить “правильный” Network.enable
✦ Получить тело ответа для всех запросов
✦ Конвертировать Performance log в HAR
✦ Добавить ответы в HAR
69
…
…?
Оно работает!
– Саша, у меня
падает тест
– В нетворке пусто
– Руками не
воспроизводится
Варианты ответа
✦ Остановить тест за шаг до падения, последний шаг
проделать вручную (с открытыми DevTools)
✦ Поставить прокси
✦ ???
75
Варианты ответа
✦ Остановить тест за шаг до падения, последний шаг
проделать вручную (с открытыми DevTools)
✦ Поставить прокси
✦ Можно получить HAR
76
Но это ещё не всё
– В нетворке пусто
– В нетворке пусто
Почему?
+-+
| |
|C|
+----------+ |h|
| DevTools | |r|
+----------+ |o|
|m|
|e|
| |
+-+
79
+-+
| |
|C|
+----------+ |h|
| DevTools | |r|
+----------+ |o|
|m|
|e|
| |
+-+
Network.enable
79
+-+
| |
|C|
+----------+ |h|
| DevTools | |r|
+----------+ |o|
|m|
|e|
| |
+-+
80
+-+
| |
|C|
+----------+ |h|
| DevTools | |r|
+----------+ |o|
|m|
|e|
| |
+-+
request
80
+-+
| |
|C|
+----------+ |h|
| DevTools | |r|
+----------+ |o|
|m|
|e|
| |
+-+
request
80
+-+
| |
|C|
+----------+ |h|
| DevTools | |r|
+----------+ |o|
|m|
|e|
| |
+-+
response
81
+-+
| |
|C|
+----------+ |h|
| DevTools | |r|
+----------+ |o|
|m|
|e|
| |
+-+
response
81
82
83
84
85
86
+----------+ +-+
| Client 1 | | |
+----------+ |C|
|h|
|r|
|o|
+----------+ |m|
| Client 2 | |e|
+----------+ | |
+-+
87
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
88
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
89
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
89
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
89
https://youtu.be/JDtuXAptypY
Варианты ответа
✦ Остановить тест за шаг до падения, последний шаг
проделать вручную (с открытыми DevTools)
✦ Поставить прокси
✦ Можно получить HAR
91
Варианты ответа
✦ Остановить тест за шаг до падения, последний шаг
проделать вручную (с открытыми DevTools)
✦ Поставить прокси
✦ Можно получить HAR
✦ В нетворке есть всё
92
Круто!
– Круто!
– А как посмотреть
как сам тест идёт?
– Ещё одно окно —
неудобно
Chrome Remote debugger
https://developers.google.com/web/tools/chrome-devtools/remote-debugging/
Headless Chrome
https://bugs.chromium.org/p/chromium/issues/detail?id=546953
Headless Chrome
99
Headless Chrome
99
https://chrome-devtools-frontend.appspot.com
/serve_file
/${hash}
/${devtoolsFrontendUrl}
&remoteFrontend=true
Headless Chrome
99
https://chrome-devtools-frontend.appspot.com
/serve_file
/${hash}
/${devtoolsFrontendUrl}
&remoteFrontend=true
100
/json/list
[{
"id": "…",
"webSocketDebuggerUrl": "…",
"devtoolsFrontendUrl": "…",
…
},
…]
Headless Chrome
100
/json/list
[{
"id": "…",
"webSocketDebuggerUrl": "…",
"devtoolsFrontendUrl": "…",
…
},
…]
Headless Chrome
101
/json/version
{
"Browser": "Chrome/54.0.2840.98",
"Protocol-Version": "1.2",
"User-Agent": "…",
"WebKit-Version": "537.36 (@8ee402c…ad)"
}
Headless Chrome
101
/json/version
{
"Browser": "Chrome/54.0.2840.98",
"Protocol-Version": "1.2",
"User-Agent": "…",
"WebKit-Version": "537.36 (@8ee402c…ad)"
}
Headless Chrome
101
/json/version
{
"Browser": "Chrome/54.0.2840.98",
"Protocol-Version": "1.2",
"User-Agent": "…",
"WebKit-Version": "537.36 (@8ee402c…ad)"
}
Headless Chrome
hash
?
https://youtu.be/X-dL_eKB1VE
One more thing…
Что он может ещё?
+-+ +-+
+-+ +--------+ +------------+ |P| |C|
|T|<---->|Selenium|<---->|ChromeDriver|<->|r| |h|
|e| +--------+ +------------+ |o|<->|r|
|s| |x| |o|
|t|<------------------------------------->|y| |m|
+-+ +-+ |e|
+-+
WebSocket
Connection
107
Технические детали
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
109
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
{ “id”: 1, …}
109
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
{ “id”: 1}
{ “id”: 1, …}
109
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
{ “id”: 1}
110
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
{ “id”: 1}
¯_( )_/¯
"
110
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
111
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
{ “id”: 19, …}
{ “id”: 19, …}
111
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
{ “id”: 19}
{ “id”: 19, …}
{ “id”: 19, …}
111
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
{ “id”: 19}
×2
{ “id”: 19, …}
{ “id”: 19, …}
111
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
{ “id”: 19}
112
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
{ “id”: 19}
¯_( )_/¯
"
112
ID
?
113
ID
2147483647Max:
114
ID
2³¹-1
115
ID
19
116
0000000000000000000000000010011
id = 19
117
0000000000000000000000000010011
id = 19client id
118
0000000010000000000000000010011
id = 19client id
119
0000000010000000000000000010011
id = 19client id
4194323
=
119
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
120
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
{ “id”: 19, …}
{ “id”: 19, …}
120
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
{ “id”: 19}
{ “id”: 19, …}
{ “id”: 19, …}
120
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
{ “id”: 19}
{ “id”: 19, …}
{ “id”: 19, …}
{ “id”:
4194323}
120
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
{ “id”:
4194323}
121
+-+
+----------+ | | +-+
| Client 1 | | | | |
+----------+ |P| |C|
|r| |h|
|o| |r|
|x| |o|
+----------+ |y| |m|
| Client 2 | | | |e|
+----------+ | | | |
+-+ +-+
{ “id”: 19, …}
{ “id”:
4194323}
121
Технические детали
122
Нужно заранее знать количество клиентов (по умолчанию 8)
Примеры
✦ Network Throttling
https://chromedevtools.github.io/debugger-protocol-viewer/1-2/Network/#method-emulateNetworkConditions
Примеры
https://chromedevtools.github.io/debugger-protocol-viewer/1-2/Network/#method-emulateNetworkConditions
Примеры
✦ Network Throttling
✦ CPU Throttling (EXPERIMENTAL)
https://chromedevtools.github.io/debugger-protocol-viewer/tot/Emulation/#method-setCPUThrottlingRate
Примеры
https://chromedevtools.github.io/debugger-protocol-viewer/tot/Emulation/#method-setCPUThrottlingRate
> {
"id":0,
"method":"Emulation.setCPUThrottlingRate",
"params":{ "rate": 10 }
}
127
> {
"id":0,
"method":"Emulation.setCPUThrottlingRate",
"params":{ "rate": 10 }
}
N times slower
127
https://youtu.be/NU46EkrRoYo
– Как запустить
тесты на плохом
соединении?
– О! Вы и это уже
можете
Где взять?
Полезно знать
132
Полезно знать
✦ devtools-proxy полностью совместим с Selenium
132
Полезно знать
✦ devtools-proxy полностью совместим с Selenium
✦ Пока нет поддержки Windows
132
Полезно знать
✦ devtools-proxy полностью совместим с Selenium
✦ Пока нет поддержки Windows
✦ Только для Chromium / Google Chrome
132
Где взять?
bayandin / devtools-proxy
133
Планы на будущее
Планы на будущее
135
Планы на будущее
135
✦ Научиться останавливаться на debugger / breakpoints
Планы на будущее
135
✦ Научиться останавливаться на debugger / breakpoints
✦ Научиться получать данные Chrome Push Notification
https://gauntface.github.io/simple-push-demo/
https://gauntface.github.io/simple-push-demo/
Планы на будущее
138
✦ Научиться останавливаться на debugger / breakpoints
✦ Научиться получать данные Chrome Push Notification
Планы на будущее
138
✦ Научиться останавливаться на debugger / breakpoints
✦ Научиться получать данные Chrome Push Notification
✦ Поддержка Android
Планы на будущее
138
✦ Научиться останавливаться на debugger / breakpoints
✦ Научиться получать данные Chrome Push Notification
✦ Поддержка Android
✦ Поддержка Windows (для chrome-wrapper)
Планы на будущее
138
✦ Научиться останавливаться на debugger / breakpoints
✦ Научиться получать данные Chrome Push Notification
✦ Поддержка Android
✦ Поддержка Windows (для chrome-wrapper)
✦ Поддержка Firefox / Edge
Сегодня я многое понял…
139
Сегодня я многое понял…
✦ Как видеть HTTP запросы во время прохождения теста
139
Сегодня я многое понял…
✦ Как видеть HTTP запросы во время прохождения теста
✦ Как видеть как идёт тест
139
Сегодня я многое понял…
✦ Как видеть HTTP запросы во время прохождения теста
✦ Как видеть как идёт тест
✦ Использовать любые Chrome Debugging Protocol методы
139
Спасибо!
BadooDev & BadooTech (en)
Badoo
tech.badoo.com
techblog.badoo.com (en)
bayandin / devtools-proxy
abayandin
The original, largest and leading
dating network

More Related Content

What's hot

непрерывная интеграция шаг к непрерывному деплою родионов игорь
непрерывная интеграция   шаг к непрерывному деплою родионов игорьнепрерывная интеграция   шаг к непрерывному деплою родионов игорь
непрерывная интеграция шаг к непрерывному деплою родионов игорь
drupalconf
 
Jenkins 2. Как сделать мажорный релиз и не развалить сообщество?
Jenkins 2. Как сделать мажорный релиз и не развалить сообщество?Jenkins 2. Как сделать мажорный релиз и не развалить сообщество?
Jenkins 2. Как сделать мажорный релиз и не развалить сообщество?
CEE-SEC(R)
 

What's hot (20)

Экономически эффективный процесс тестирования
Экономически эффективный процесс тестированияЭкономически эффективный процесс тестирования
Экономически эффективный процесс тестирования
 
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)
 
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
 
Автоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST APIАвтоматизация функционального тестирования REST API
Автоматизация функционального тестирования REST API
 
Github Flow. Тестировщики против тестирования
Github Flow. Тестировщики против тестированияGithub Flow. Тестировщики против тестирования
Github Flow. Тестировщики против тестирования
 
Илья Кудинов
Илья КудиновИлья Кудинов
Илья Кудинов
 
Опыт тестирования API САПР платформы
Опыт тестирования API САПР платформыОпыт тестирования API САПР платформы
Опыт тестирования API САПР платформы
 
10M tests per day
10M tests per day10M tests per day
10M tests per day
 
Java 9 модули
Java 9 модулиJava 9 модули
Java 9 модули
 
Применение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектахПрименение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектах
 
Highway to Сontinuous Integration, Денис Трифонов (2GIS)
Highway to Сontinuous Integration, Денис Трифонов (2GIS)Highway to Сontinuous Integration, Денис Трифонов (2GIS)
Highway to Сontinuous Integration, Денис Трифонов (2GIS)
 
Оценка качества автотестов
Оценка качества автотестовОценка качества автотестов
Оценка качества автотестов
 
Jenkins Imperative Pipeline vs Declarative Pipeline
Jenkins Imperative Pipeline vs Declarative Pipeline Jenkins Imperative Pipeline vs Declarative Pipeline
Jenkins Imperative Pipeline vs Declarative Pipeline
 
Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?Java 9 Модули. Почему не OSGi?
Java 9 Модули. Почему не OSGi?
 
Selenium grid on-demand
Selenium grid on-demandSelenium grid on-demand
Selenium grid on-demand
 
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемыMoscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
 
С чем едят JS-дебаггур?!
С чем едят JS-дебаггур?!С чем едят JS-дебаггур?!
С чем едят JS-дебаггур?!
 
непрерывная интеграция шаг к непрерывному деплою родионов игорь
непрерывная интеграция   шаг к непрерывному деплою родионов игорьнепрерывная интеграция   шаг к непрерывному деплою родионов игорь
непрерывная интеграция шаг к непрерывному деплою родионов игорь
 
Jenkins 2. Как сделать мажорный релиз и не развалить сообщество?
Jenkins 2. Как сделать мажорный релиз и не развалить сообщество?Jenkins 2. Как сделать мажорный релиз и не развалить сообщество?
Jenkins 2. Как сделать мажорный релиз и не развалить сообщество?
 
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»
 

Viewers also liked

Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo
Badoo Development
 
Как мы готовим MySQL
 Как мы готовим MySQL  Как мы готовим MySQL
Как мы готовим MySQL
Badoo Development
 
5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоада5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоада
Badoo Development
 
Мобильный веб: назад в будущее
Мобильный веб: назад в будущееМобильный веб: назад в будущее
Мобильный веб: назад в будущее
Badoo Development
 
Технологии vs коммуникации: что важнее?
Технологии vs коммуникации: что важнее?Технологии vs коммуникации: что важнее?
Технологии vs коммуникации: что важнее?
Badoo Development
 
Как слать 100М писем каждый день - секреты емейл-рассылок компании Badoo (Анд...
Как слать 100М писем каждый день - секреты емейл-рассылок компании Badoo (Анд...Как слать 100М писем каждый день - секреты емейл-рассылок компании Badoo (Анд...
Как слать 100М писем каждый день - секреты емейл-рассылок компании Badoo (Анд...
Andrey Sas
 
Емейл консалтинг как он есть - о чём нужно думать емейл-маркетологу, чтобы сд...
Емейл консалтинг как он есть - о чём нужно думать емейл-маркетологу, чтобы сд...Емейл консалтинг как он есть - о чём нужно думать емейл-маркетологу, чтобы сд...
Емейл консалтинг как он есть - о чём нужно думать емейл-маркетологу, чтобы сд...
Andrey Sas
 
Почта в интернет-проекте: инфраструктура, статистика, мониторинг
Почта в интернет-проекте: инфраструктура, статистика, мониторингПочта в интернет-проекте: инфраструктура, статистика, мониторинг
Почта в интернет-проекте: инфраструктура, статистика, мониторинг
Andrey Sas
 

Viewers also liked (20)

Методология: БЭМ, Модули, Отношения
Методология: БЭМ, Модули, ОтношенияМетодология: БЭМ, Модули, Отношения
Методология: БЭМ, Модули, Отношения
 
Git хуки на страже качества кода
Git хуки на страже качества кодаGit хуки на страже качества кода
Git хуки на страже качества кода
 
Как мы готовим MySQL
Как мы готовим MySQLКак мы готовим MySQL
Как мы готовим MySQL
 
Versioning strategy for a complex internal API
Versioning strategy for a complex internal APIVersioning strategy for a complex internal API
Versioning strategy for a complex internal API
 
Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo
 
Как мы готовим MySQL
 Как мы готовим MySQL  Как мы готовим MySQL
Как мы готовим MySQL
 
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»  Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
 
5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоада5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоада
 
Багфиксинг процесса разработки в iOS: взгляд с двух сторон
Багфиксинг процесса разработки в iOS: взгляд с двух сторонБагфиксинг процесса разработки в iOS: взгляд с двух сторон
Багфиксинг процесса разработки в iOS: взгляд с двух сторон
 
Как автотесты ускоряют релизы в OK.ru
Как автотесты ускоряют релизы в OK.ruКак автотесты ускоряют релизы в OK.ru
Как автотесты ускоряют релизы в OK.ru
 
Мобильный веб: назад в будущее
Мобильный веб: назад в будущееМобильный веб: назад в будущее
Мобильный веб: назад в будущее
 
Технологии vs коммуникации: что важнее?
Технологии vs коммуникации: что важнее?Технологии vs коммуникации: что важнее?
Технологии vs коммуникации: что важнее?
 
Skill development
Skill developmentSkill development
Skill development
 
DissertationDefenseBenya
DissertationDefenseBenyaDissertationDefenseBenya
DissertationDefenseBenya
 
Manajemen produksi
Manajemen produksiManajemen produksi
Manajemen produksi
 
Tachismo tercer ciclo primaria
Tachismo tercer ciclo primariaTachismo tercer ciclo primaria
Tachismo tercer ciclo primaria
 
European Microwave PLL Class
European Microwave PLL ClassEuropean Microwave PLL Class
European Microwave PLL Class
 
Как слать 100М писем каждый день - секреты емейл-рассылок компании Badoo (Анд...
Как слать 100М писем каждый день - секреты емейл-рассылок компании Badoo (Анд...Как слать 100М писем каждый день - секреты емейл-рассылок компании Badoo (Анд...
Как слать 100М писем каждый день - секреты емейл-рассылок компании Badoo (Анд...
 
Емейл консалтинг как он есть - о чём нужно думать емейл-маркетологу, чтобы сд...
Емейл консалтинг как он есть - о чём нужно думать емейл-маркетологу, чтобы сд...Емейл консалтинг как он есть - о чём нужно думать емейл-маркетологу, чтобы сд...
Емейл консалтинг как он есть - о чём нужно думать емейл-маркетологу, чтобы сд...
 
Почта в интернет-проекте: инфраструктура, статистика, мониторинг
Почта в интернет-проекте: инфраструктура, статистика, мониторингПочта в интернет-проекте: инфраструктура, статистика, мониторинг
Почта в интернет-проекте: инфраструктура, статистика, мониторинг
 

Similar to ChromeDriver Jailbreak

Непрерывная интеграция шаг к непрерывному деплою. Родионов Игорь
Непрерывная интеграция шаг к непрерывному деплою. Родионов ИгорьНепрерывная интеграция шаг к непрерывному деплою. Родионов Игорь
Непрерывная интеграция шаг к непрерывному деплою. Родионов Игорь
PVasili
 
Cовременный станок верстальщика
Cовременный станок верстальщикаCовременный станок верстальщика
Cовременный станок верстальщика
mcslayer
 
Непрерывная интеграция - шаг к непрерывному деплойменту
Непрерывная интеграция - шаг к непрерывному деплойментуНепрерывная интеграция - шаг к непрерывному деплойменту
Непрерывная интеграция - шаг к непрерывному деплойменту
Игорь Родионов
 

Similar to ChromeDriver Jailbreak (20)

Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"
Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"
Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"
 
Sqadays 2010 burmistrov_fomin_20101120(2)
Sqadays 2010 burmistrov_fomin_20101120(2)Sqadays 2010 burmistrov_fomin_20101120(2)
Sqadays 2010 burmistrov_fomin_20101120(2)
 
Развитие процессов тестирования в Badoo за три года
Развитие процессов тестирования в Badoo за три годаРазвитие процессов тестирования в Badoo за три года
Развитие процессов тестирования в Badoo за три года
 
QA Fest 2019. Александр Хотемской. WebdriverIO + Puppeteer. Double gun - doub...
QA Fest 2019. Александр Хотемской. WebdriverIO + Puppeteer. Double gun - doub...QA Fest 2019. Александр Хотемской. WebdriverIO + Puppeteer. Double gun - doub...
QA Fest 2019. Александр Хотемской. WebdriverIO + Puppeteer. Double gun - doub...
 
Appium для народа
Appium для народаAppium для народа
Appium для народа
 
Владислав Акулич - Monkey Talk - кроссплатформенное средство автоматизации те...
Владислав Акулич - Monkey Talk - кроссплатформенное средство автоматизации те...Владислав Акулич - Monkey Talk - кроссплатформенное средство автоматизации те...
Владислав Акулич - Monkey Talk - кроссплатформенное средство автоматизации те...
 
GUI-автоматизация в Telerik Test Studio
GUI-автоматизация в Telerik Test StudioGUI-автоматизация в Telerik Test Studio
GUI-автоматизация в Telerik Test Studio
 
Непрерывная интеграция шаг к непрерывному деплою. Родионов Игорь
Непрерывная интеграция шаг к непрерывному деплою. Родионов ИгорьНепрерывная интеграция шаг к непрерывному деплою. Родионов Игорь
Непрерывная интеграция шаг к непрерывному деплою. Родионов Игорь
 
Monkey Talk - кросс-платформенное средство автоматизации тестирования мобильн...
Monkey Talk - кросс-платформенное средство автоматизации тестирования мобильн...Monkey Talk - кросс-платформенное средство автоматизации тестирования мобильн...
Monkey Talk - кросс-платформенное средство автоматизации тестирования мобильн...
 
WebdriverIO + Puppeteer. Double gun – double fun
WebdriverIO + Puppeteer. Double gun – double funWebdriverIO + Puppeteer. Double gun – double fun
WebdriverIO + Puppeteer. Double gun – double fun
 
Automation testing desktop applications
Automation testing desktop applicationsAutomation testing desktop applications
Automation testing desktop applications
 
DEV Labs 2016. Микросервисы - первая кровь
DEV Labs 2016. Микросервисы - первая кровьDEV Labs 2016. Микросервисы - первая кровь
DEV Labs 2016. Микросервисы - первая кровь
 
Cовременный станок верстальщика
Cовременный станок верстальщикаCовременный станок верстальщика
Cовременный станок верстальщика
 
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
 
Непрерывная интеграция - шаг к непрерывному деплойменту
Непрерывная интеграция - шаг к непрерывному деплойментуНепрерывная интеграция - шаг к непрерывному деплойменту
Непрерывная интеграция - шаг к непрерывному деплойменту
 
5 oleg nikiforov - automating routine tasks for mobile apps testing
5   oleg nikiforov - automating routine tasks for mobile apps testing5   oleg nikiforov - automating routine tasks for mobile apps testing
5 oleg nikiforov - automating routine tasks for mobile apps testing
 
RealSpeaker PRO RUS
RealSpeaker PRO RUSRealSpeaker PRO RUS
RealSpeaker PRO RUS
 
RealSpeaker RUS
RealSpeaker RUSRealSpeaker RUS
RealSpeaker RUS
 
Изоморфные react-приложения
Изоморфные react-приложенияИзоморфные react-приложения
Изоморфные react-приложения
 
Unity: "Очевидное-невероятное” или хитрости разработки на Unity Android
Unity: "Очевидное-невероятное” или хитрости разработки на Unity AndroidUnity: "Очевидное-невероятное” или хитрости разработки на Unity Android
Unity: "Очевидное-невероятное” или хитрости разработки на Unity Android
 

More from Badoo Development

More from Badoo Development (18)

Viktar Karanevich – iOS Parallel Automation
Viktar Karanevich – iOS Parallel AutomationViktar Karanevich – iOS Parallel Automation
Viktar Karanevich – iOS Parallel Automation
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
Григорий Джанелидзе, OK.RU
Григорий Джанелидзе, OK.RUГригорий Джанелидзе, OK.RU
Григорий Джанелидзе, OK.RU
 
Андрей Сидоров, Яндекс.Браузер
Андрей Сидоров, Яндекс.БраузерАндрей Сидоров, Яндекс.Браузер
Андрей Сидоров, Яндекс.Браузер
 
Филипп Уваров, Avito
Филипп Уваров, AvitoФилипп Уваров, Avito
Филипп Уваров, Avito
 
Cocoaheads Meetup / Alex Zimin / Swift magic
Cocoaheads Meetup / Alex Zimin / Swift magicCocoaheads Meetup / Alex Zimin / Swift magic
Cocoaheads Meetup / Alex Zimin / Swift magic
 
Cocoaheads Meetup / Kateryna Trofimenko / Feature development
Cocoaheads Meetup / Kateryna Trofimenko / Feature developmentCocoaheads Meetup / Kateryna Trofimenko / Feature development
Cocoaheads Meetup / Kateryna Trofimenko / Feature development
 
Alex Krasheninnikov – Hadoop High Availability
Alex Krasheninnikov – Hadoop High AvailabilityAlex Krasheninnikov – Hadoop High Availability
Alex Krasheninnikov – Hadoop High Availability
 
Андрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данныхАндрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данных
 
Александр Зобнин, Grafana Labs
Александр Зобнин, Grafana LabsАлександр Зобнин, Grafana Labs
Александр Зобнин, Grafana Labs
 
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественноИлья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
 
TechLeads meetup: Андрей Шелёхин, Tinkoff.ru
TechLeads meetup: Андрей Шелёхин, Tinkoff.ruTechLeads meetup: Андрей Шелёхин, Tinkoff.ru
TechLeads meetup: Андрей Шелёхин, Tinkoff.ru
 
TechLeads meetup: Алексей Рыбак, Badoo
TechLeads meetup: Алексей Рыбак, BadooTechLeads meetup: Алексей Рыбак, Badoo
TechLeads meetup: Алексей Рыбак, Badoo
 
TechLeads meetup: Евгений Потапов, ITSumma
TechLeads meetup: Евгений Потапов, ITSumma TechLeads meetup: Евгений Потапов, ITSumma
TechLeads meetup: Евгений Потапов, ITSumma
 
TechLeads meetup: Макс Лапшин, Erlyvideo
TechLeads meetup: Макс Лапшин, ErlyvideoTechLeads meetup: Макс Лапшин, Erlyvideo
TechLeads meetup: Макс Лапшин, Erlyvideo
 
S.O.L.I.D-ый JavaScript
S.O.L.I.D-ый JavaScriptS.O.L.I.D-ый JavaScript
S.O.L.I.D-ый JavaScript
 
Что надо знать о HTTP/2
Что надо знать о HTTP/2Что надо знать о HTTP/2
Что надо знать о HTTP/2
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 

ChromeDriver Jailbreak