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
нет тела ответа
ChromeDriver Jailbreak
Как работает
драйвер
+------+ +------------+ +-------+
|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
ChromeDriver Jailbreak
ChromeDriver Jailbreak
Тело ответа в 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
ChromeDriver Jailbreak
+-+
+-+ +--------+ +------------+ |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
ChromeDriver Jailbreak
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
?
ChromeDriver Jailbreak
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

PDF
Как мы приручили демона или процесс тестирования демонов в Badoo
PPTX
Jenkins 2.0: Организуем тестирование в составе Continuous Delivery
PDF
Концепция QaAPI: взгляд на тестирование с другой стороны баррикад
PDF
Михаил Корепанов "Инкрементальные обновления на клиенте"
PDF
QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущ...
PDF
РИФ 2016, Внедрение контроля качества в большом web-проекте на примере Badoo
PDF
BDD girls Battle: Cucumber VS. JBehave
PDF
Микросервисы для автоматизации тестирования - опыт "Одноклассников"
Как мы приручили демона или процесс тестирования демонов в Badoo
Jenkins 2.0: Организуем тестирование в составе Continuous Delivery
Концепция QaAPI: взгляд на тестирование с другой стороны баррикад
Михаил Корепанов "Инкрементальные обновления на клиенте"
QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущ...
РИФ 2016, Внедрение контроля качества в большом web-проекте на примере Badoo
BDD girls Battle: Cucumber VS. JBehave
Микросервисы для автоматизации тестирования - опыт "Одноклассников"

What's hot (20)

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

Viewers also liked (20)

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

Similar to ChromeDriver Jailbreak (20)

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

More from Badoo Development (18)

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

ChromeDriver Jailbreak