246
ChromeDriver Jailbreak Александр Баяндин

ChromeDriver Jailbreak

Embed Size (px)

Citation preview

Page 1: ChromeDriver Jailbreak

ChromeDriver JailbreakАлександр Баяндин

Page 2: ChromeDriver Jailbreak

“ THIS IS THE MOST POPULAR DATING APP IN THE WORLD— Time

Page 3: ChromeDriver Jailbreak

400KРегистраций

в день

5Платформ

330MПользователей

1.8чИспользование

в день

350MСообщений в

день

21MDAU

54MMAU

10MФотозагрузок

в день

О нас

Page 4: ChromeDriver Jailbreak

400KРегистраций

в день

5Платформ

330MПользователей

1.8чИспользование

в день

350MСообщений в

день

21MDAU

54MMAU

10MФотозагрузок

в день

О нас

Page 5: ChromeDriver Jailbreak

Платформы

✦ Desktop Web

4

Page 6: ChromeDriver Jailbreak

Платформы

✦ Desktop Web

✦ iOS

4

Page 7: ChromeDriver Jailbreak

Платформы

✦ Desktop Web

✦ iOS

✦ Android

4

Page 8: ChromeDriver Jailbreak

Платформы

✦ Desktop Web

✦ iOS

✦ Android

✦ Windows Phone

4

Page 9: ChromeDriver Jailbreak

Платформы

✦ Desktop Web

✦ iOS

✦ Android

✦ Windows Phone

✦ Mobile Web

4

Page 10: ChromeDriver Jailbreak

Mobile Test Automation

Платформы

✦ Desktop Web

✦ iOS

✦ Android

✦ Windows Phone

✦ Mobile Web

4

Page 11: ChromeDriver Jailbreak

Mobile Test Automation

Платформы

✦ Desktop Web

✦ iOS

✦ Android

✦ Windows Phone

✦ Mobile Web

4

Page 12: ChromeDriver Jailbreak

Mobile Test Automation

Платформы

✦ Desktop Web

✦ iOS

✦ Android

✦ Windows Phone

✦ Mobile Web

4

Page 13: ChromeDriver Jailbreak

Mobile Test Automation Team

Page 14: ChromeDriver Jailbreak

Mobile Test Automation Team

✦ Ruby & Cucumber

6

Page 15: ChromeDriver Jailbreak

Mobile Test Automation Team

✦ Ruby & Cucumber

✦ Calabash, Selenium & Winium.Mobile

6

Page 16: ChromeDriver Jailbreak

Mobile Test Automation Team

✦ Ruby & Cucumber

✦ Calabash, Selenium & Winium.Mobile

✦ TeamCity

6

Page 17: ChromeDriver Jailbreak

Mobile Test Automation Team

✦ Ruby & Cucumber

✦ Calabash, Selenium & Winium.Mobile

✦ TeamCity

✦ Кросс-платформенная автоматизация

6

Page 18: ChromeDriver Jailbreak

7

Scenario

Кросс-платформенная автоматизация

Page 19: ChromeDriver Jailbreak

7

Scenario

Step

Кросс-платформенная автоматизация

Page 20: ChromeDriver Jailbreak

7

Step Definition

Scenario

Step

Кросс-платформенная автоматизация

Page 21: ChromeDriver Jailbreak

Page Objects

7

Step Definition

Scenario

Step

Кросс-платформенная автоматизация

Page 22: ChromeDriver Jailbreak

Page Objects

7

Step Definition

Scenario

Step

Кросс-платформенная автоматизация

Page 23: ChromeDriver Jailbreak

8

Step Definition

iOS POAndroid Page Objects MW PO WP PO

Scenario

Step

Кросс-платформенная автоматизация

Page 24: ChromeDriver Jailbreak

8

Step Definition

iOS POAndroid Page Objects MW PO WP PO

Scenario

Step

Calabash

Кросс-платформенная автоматизация

Page 25: ChromeDriver Jailbreak

8

Step Definition

iOS POAndroid Page Objects MW PO WP PO

Scenario

Step

Calabash Selenium

Кросс-платформенная автоматизация

Page 26: ChromeDriver Jailbreak

8

Step Definition

iOS POAndroid Page Objects MW PO WP PO

Scenario

Step

Calabash Selenium Winium.Mobile

Кросс-платформенная автоматизация

Page 27: ChromeDriver Jailbreak

Mobile Test Automation Team

✦ Ruby & Cucumber

✦ Calabash, Selenium & Winium.Mobile

✦ TeamCity

✦ Кросс-платформенная автоматизация

9

Page 28: ChromeDriver Jailbreak

Mobile Test Automation Team

✦ Ruby & Cucumber

✦ Calabash, Selenium & Winium.Mobile

✦ TeamCity

✦ Кросс-платформенная автоматизация

✦ Мы клёвые !

9

Page 29: ChromeDriver Jailbreak

Автоматизация

Page 30: ChromeDriver Jailbreak

Процесс разработки

11

Page 31: ChromeDriver Jailbreak

Процесс разработки

✦ Разработчик разрабатывает

11

Page 32: ChromeDriver Jailbreak

Процесс разработки

✦ Разработчик разрабатывает

✦ Тестировщик тестирует

11

Page 33: ChromeDriver Jailbreak

Процесс разработки

✦ Разработчик разрабатывает

✦ Тестировщик тестирует

✦ Пользователь пользуется

11

Page 34: ChromeDriver Jailbreak

✦ Разработчик разрабатывает

✦ Тестировщик тестирует

✦ Пользователь пользуется

Процесс разработки

12

Page 35: ChromeDriver Jailbreak

✦ Разработчик разрабатывает

✦ Тестировщик тестирует

✦ Пользователь пользуется

Процесс разработки

12

Автоматизация тестирования

Page 36: ChromeDriver Jailbreak

✦ Разработчик разрабатывает

✦ Тестировщик тестирует

✦ Пользователь пользуется

Процесс разработки

12

Автоматизация тестирования

Page 37: ChromeDriver Jailbreak

– Саша, у меня падает тест

Page 38: ChromeDriver Jailbreak

– В нетворке пусто

Page 39: ChromeDriver Jailbreak

– Руками не воспроизводится

Page 40: ChromeDriver Jailbreak

Варианты ответа

16

Page 41: ChromeDriver Jailbreak

Варианты ответа

✦ Остановить тест за шаг до падения, последний шаг проделать вручную (с открытыми DevTools)

16

Page 42: ChromeDriver Jailbreak

Варианты ответа

✦ Остановить тест за шаг до падения, последний шаг проделать вручную (с открытыми DevTools)

✦ Поставить прокси

16

Page 43: ChromeDriver Jailbreak

Варианты ответа

✦ Остановить тест за шаг до падения, последний шаг проделать вручную (с открытыми DevTools)

✦ Поставить прокси

✦ ???

16

Page 44: ChromeDriver Jailbreak

У нас же Chrome!

17

Page 45: ChromeDriver Jailbreak

У нас же Chrome!

✦ ChromeDriver умеет Performance log

https://sites.google.com/a/chromium.org/chromedriver/logging/performance-log

Page 46: ChromeDriver Jailbreak

У нас же Chrome!

http://www.softwareishard.com/har/viewer/

Page 47: ChromeDriver Jailbreak

У нас же Chrome!

20

✦ ChromeDriver умеет Performance log

✦ Нужно конвертировать Performance log в HAR

Page 48: ChromeDriver Jailbreak

https://github.com/woodsaj/chromedriver_har

Page 49: ChromeDriver Jailbreak

woodsaj/chromedriver_har

✦ Конвертирует Performance log в HAR

22

Page 50: ChromeDriver Jailbreak

woodsaj/chromedriver_har

✦ Конвертирует Performance log в HAR

✦ Написан на и для Go

22

Page 51: ChromeDriver Jailbreak

woodsaj/chromedriver_har

23

RubyGo

Page 52: ChromeDriver Jailbreak

woodsaj/chromedriver_harGoRuby

24

Page 53: ChromeDriver Jailbreak

woodsaj/chromedriver_harGoRuby

Сохранить Performance log в JSON файл

24

Page 54: ChromeDriver Jailbreak

woodsaj/chromedriver_harGo

Прочитать файл

Ruby

Сохранить Performance log в JSON файл

24

Page 55: ChromeDriver Jailbreak

woodsaj/chromedriver_harGo

Прочитать файл

Десериализовать

Ruby

Сохранить Performance log в JSON файл

24

Page 56: ChromeDriver Jailbreak

woodsaj/chromedriver_harGo

Прочитать файл

Десериализовать

Конвертировать в HAR

Ruby

Сохранить Performance log в JSON файл

24

Page 57: ChromeDriver Jailbreak

woodsaj/chromedriver_harGo

Прочитать файл

Десериализовать

Конвертировать в HAR

Сохранить HAR файл

Ruby

Сохранить Performance log в JSON файл

24

Page 58: ChromeDriver Jailbreak

woodsaj/chromedriver_har

https://gist.github.com/bayandin/2645a367a7132b355ea25d372a481e84

Go

Прочитать файл

Десериализовать

Конвертировать в HAR

Сохранить HAR файл

Ruby

Сохранить Performance log в JSON файл

Page 59: ChromeDriver Jailbreak

Решение

✦ Включить Performance log в тестах

✦ Конвертировать Performance log в HAR

26

Page 60: ChromeDriver Jailbreak

В Performance log нет тела ответа

Page 61: ChromeDriver Jailbreak
Page 62: ChromeDriver Jailbreak

Как работает драйвер

Page 63: ChromeDriver Jailbreak

+------+ +------------+ +-------+ |Client|<------>| Driver |<------>|Browser| +------+ +------------+ +-------+

30

Page 64: ChromeDriver Jailbreak

+------+ +------------+ +-------+ |Client|<------>| Driver |<------>|Browser| +------+ +------------+ +-------+

Selenium / test

30

Page 65: ChromeDriver Jailbreak

+------+ +------------+ +-------+ |Client|<------>| Driver |<------>|Browser| +------+ +------------+ +-------+

WebDriver Protocol

Selenium / test

30

Page 66: ChromeDriver Jailbreak

+------+ +------------+ +-------+ |Client|<------>| Driver |<------>|Browser| +------+ +------------+ +-------+

WebDriver Protocol Protocol

Selenium / test

30

Page 67: ChromeDriver Jailbreak

+------+ +------------+ +-------+ |Client|<------>| Driver |<------>|Browser| +------+ +------------+ +-------+

WebDriver Protocol

Chrome Debugging Protocol

Selenium / test

31

ChromeDriver Chrome

Page 68: ChromeDriver Jailbreak

+------+ +------------+ +-------+ |Client|<------>| Driver |<------>|Browser| +------+ +------------+ +-------+

WebDriver Protocol

Chrome Debugging Protocol

Selenium / test

31

ChromeDriver Chrome

Page 69: ChromeDriver Jailbreak

Chrome Debugging Protocol

✦ Реализован поверх WebSocket

32

Page 70: ChromeDriver Jailbreak

Chrome Debugging Protocol

✦ Реализован поверх WebSocket

✦ Используется в Chrome DevTools

https://developer.chrome.com/devtools/docs/debugger-protocol

Page 71: ChromeDriver Jailbreak
Page 72: ChromeDriver Jailbreak
Page 73: ChromeDriver Jailbreak

Тело ответа в DevToolsNetwork.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

Page 74: ChromeDriver Jailbreak

Решение

✦ Включить Performance log в тестах

✦ Конвертировать Performance log в HAR

36

Page 75: ChromeDriver Jailbreak

Решение

✦ Включить Performance log в тестах

✦ Получить тело ответа для всех запросов

✦ Конвертировать Performance log в HAR

37

Page 76: ChromeDriver Jailbreak

Решение

✦ Включить Performance log в тестах

✦ Получить тело ответа для всех запросов

✦ Конвертировать Performance log в HAR

✦ Добавить ответы в HAR

37

Page 77: ChromeDriver Jailbreak

+-+ +-+ +--------+ +------------+ |C| |T|<---->|Selenium|<---->|ChromeDriver|<------->|h| |e| +--------+ +------------+ |r| |s| |o| |t|<------------------------------------------->|m| +-+ |e| +-+

WebSocket Connection

38

Page 78: ChromeDriver Jailbreak

Возможно только одно одновременное подключениe

Chrome Debugging Protocol

https://developer.chrome.com/devtools/docs/debugger-protocol#simultaneous

Page 79: ChromeDriver Jailbreak
Page 80: ChromeDriver Jailbreak

+-+ +-+ +--------+ +------------+ |C| |T|<---->|Selenium|<---->|ChromeDriver|<------->|h| |e| +--------+ +------------+ |r| |s| |o| |t|<------------------------------------------->|m| +-+ |e| +-+

WebSocket Connection

41

Page 81: ChromeDriver Jailbreak

+-+ +-+ +--------+ +------------+ |C| |T|<---->|Selenium|<---->|ChromeDriver|<------->|h| |e| +--------+ +------------+ |r| |s| |o| |t|<------------------------------------------->|m| +-+ |e| +-+

WebSocket Connection

/////

/////

41

Page 82: ChromeDriver Jailbreak

Нужен прокси

Page 83: ChromeDriver Jailbreak

+-+ +-+ +--------+ +------------+ |C| |T|<---->|Selenium|<---->|ChromeDriver|<------->|h| |e| +--------+ +------------+ |r| |s| |o| |t|<------------------------------------------->|m| +-+ |e| +-+

WebSocket Connection

/////

/////

43

Page 84: ChromeDriver Jailbreak

+-+ +-+ +-+ +--------+ +------------+ |P| |C| |T|<---->|Selenium|<---->|ChromeDriver|<->|r| |h| |e| +--------+ +------------+ |o|<->|r| |s| |x| |o| |t|<------------------------------------->|y| |m| +-+ +-+ |e| +-+

WebSocket Connection

44

Page 85: ChromeDriver Jailbreak

Как встроить прокси?

45

Page 86: ChromeDriver Jailbreak

Как работает драйвер. Часть 2

Page 87: ChromeDriver Jailbreak

+-+ |C| |h| |r| |o| |m| |e| |D| |r| |i| |v| |e| |r| +-+

47

Page 88: ChromeDriver Jailbreak

+-+ |C| |h| |r| |o| |m| |e| |D| |r| |i| |v| |e| |r| +-+

POST /ses

sion

47

Page 89: ChromeDriver Jailbreak

+-+ |C| |h| |r| |o| |m| |e| |D| |r| |i| |v| |e| |r| +-+

POST /ses

sion

DesiredCapabi

lities

47

Page 90: ChromeDriver Jailbreak

+-+ |C| |h| |r| |o| |m| |e| |D| |r| |i| |v| |e| |r| +-+

POST /ses

sion

DesiredCapabi

lities

chromeOpti

ons

47

Page 91: ChromeDriver Jailbreak

+-+ |C| |h| |r| |o| |m| |e| |D| |r| |i| |v| |e| |r| +-+

POST /ses

sion

DesiredCapabi

lities

chromeOpti

ons

binary

47

Page 92: ChromeDriver Jailbreak

+-+ |C| |h| |r| |o| |m| |e| |D| |r| |i| |v| |e| |r| +-+

POST /ses

sion

google-chrome

DesiredCapabi

lities

chromeOpti

ons

binary

47

Page 93: ChromeDriver Jailbreak

+-+ |C| |h| |r| |o| |m| |e| |D| |r| |i| |v| |e| |r| +-+

POST /ses

sion

google-chrome … --remote-debugging-port=X

DesiredCapabi

lities

chromeOpti

ons

binary

48

Page 94: ChromeDriver Jailbreak

+-+ |C| |h| |r| |o| |m| |e| |D| |r| |i| |v| |e| |r| +-+

POST /ses

sion

google-chrome … --remote-debugging-port=X12000 < X < 13000

DesiredCapabi

lities

chromeOpti

ons

binary

48

Page 95: ChromeDriver Jailbreak

+-+ |C| |h| |r| +-+ |o| |C| |m| |h| |e| |r| |D| |o| |r| |m| |i| |e| |v| +-+ |e| |r| +-+

49

Page 96: ChromeDriver Jailbreak

+-+ |C| |h| |r| +-+ |o| |C| |m| |h| |e| |r| |D| |o| |r| |m| |i| |e| |v| +-+ |e| |r| +-+

/json/version

49

Page 97: ChromeDriver Jailbreak

+-+ |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

Page 98: ChromeDriver Jailbreak

+-+ |C| |h| |r| +-+ |o| |C| |m| |h| |e| |r| |D| |o| |r| |m| |i| |e| |v| +-+ |e| |r| +-+

/json/list/json/version

50

Page 99: ChromeDriver Jailbreak

+-+ |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

Page 100: ChromeDriver Jailbreak

+-+ |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

Page 101: ChromeDriver Jailbreak

+-+ |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

Page 102: ChromeDriver Jailbreak

Как встроить прокси?

52

Page 103: ChromeDriver Jailbreak

Как встроить прокси?

Использовать свой скрипт в binary в ChromeOptions.

52

Page 104: ChromeDriver Jailbreak

+-+ |C| |h| |r| |o| |m| |e| |D| |r| |i| |v| |e| |r| +-+

POST /ses

sion

DesiredCapabi

lities

chromeOpti

ons

binary

53

Page 105: ChromeDriver Jailbreak

+-+ |C| |h| |r| |o| |m| |e| |D| |r| |i| |v| |e| |r| +-+

POST /ses

sion

chrome-wrapper

DesiredCapabi

lities

chromeOpti

ons

binary

53

Page 106: ChromeDriver Jailbreak

+-+ |C| |h| |r| |o| |m| |e| |D| |r| |i| |v| |e| |r| +-+

POST /ses

sion

chrome-wrapper … --remote-debugging-port=X

DesiredCapabi

lities

chromeOpti

ons

binary

54

Page 107: ChromeDriver Jailbreak

+-+ |C| |h| |r| |o| |m| |e| |D| |r| |i| |v| |e| |r| +-+

POST /ses

sion

chrome-wrapper … --remote-debugging-port=X

DesiredCapabi

lities

chromeOpti

ons

binary

portX

54

Page 108: ChromeDriver Jailbreak

+-+ |C| |h| |r| |o| |m| |e| |D| |r| |i| |v| |e| |r| +-+

POST /ses

sion

chrome-wrapper … --remote-debugging-port=X

DesiredCapabi

lities

chromeOpti

ons

binary

portY

portX

54

Page 109: ChromeDriver Jailbreak

+-+ |C| |h| |r| +-+ |o| |C| |m| |h| |e| |r| |D| |o| |r| +--------------+ |m| |i| |DevTools Proxy| |e| |v| +--------------+ +-+ |e| |r| +-+

55

Page 110: ChromeDriver Jailbreak

+-+ |C| |h| |r| +-+ |o| |C| |m| |h| |e| |r| |D| |o| |r| +--------------+ |m| |i| |DevTools Proxy| |e| |v| +--------------+ +-+ |e| |r| +-+

/json/versionportX

55

Page 111: ChromeDriver Jailbreak

+-+ |C| |h| |r| +-+ |o| |C| |m| |h| |e| |r| |D| |o| |r| +--------------+ |m| |i| |DevTools Proxy| |e| |v| +--------------+ +-+ |e| |r| +-+

/json/versionportX

portY

55

Page 112: ChromeDriver Jailbreak

+-+ |C| |h| |r| +-+ |o| |C| |m| |h| |e| |r| |D| |o| |r| +--------------+ |m| |i| |DevTools Proxy| |e| |v| +--------------+ +-+ |e| |r| +-+

/json/versionportX

portY

55

Page 113: ChromeDriver Jailbreak

+-+ |C| |h| |r| +-+ |o| |C| |m| |h| |e| |r| |D| |o| |r| +--------------+ |m| |i| |DevTools Proxy| |e| |v| +--------------+ +-+ |e| |r| +-+

/json/versionportX

portY

55

Page 114: ChromeDriver Jailbreak

+-+ |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

Page 115: ChromeDriver Jailbreak

+-+ |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

Page 116: ChromeDriver Jailbreak

+-+ |C| |h| |r| +-+ |o| |C| |m| |h| |e| |r| |D| |o| |r| +--------------+ |m| |i| |DevTools Proxy| |e| |v| +--------------+ +-+ |e| |r| +-+

ws

ws

Tests

ws

portXportX

portY

56

Page 117: ChromeDriver Jailbreak

+-+ |C| |h| |r| +-+ |o| |C| |m| |h| |e| |r| |D| |o| |r| +--------------+ |m| |i| |DevTools Proxy| |e| |v| +--------------+ +-+ |e| |r| +-+

: 12000 < X < 13000ws

ws

Tests

ws

portXportX

portY

56

Page 118: ChromeDriver Jailbreak

+-+ |C| |h| |r| +-+ |o| |C| |m| |h| |e| |r| |D| |o| |r| +--------------+ |m| |i| |DevTools Proxy| |e| |v| +--------------+ +-+ |e| |r| +-+

ws

wsws

TestsportZportX

portY

57

Page 119: ChromeDriver Jailbreak

Финальная логика

✦ Включить Performance log в тестах

✦ Получить тело ответа для всех запросов

✦ Конвертировать Performance log в HAR

✦ Добавить ответы в HAR

58

Page 120: ChromeDriver Jailbreak

Финальная логика

✦ Передать chrome-wrapper в binary в ChromeOptions

✦ Включить Performance log в тестах

✦ Получить тело ответа для всех запросов

✦ Конвертировать Performance log в HAR

✦ Добавить ответы в HAR

59

Page 121: ChromeDriver Jailbreak

Получение тела ответа

Page 122: ChromeDriver Jailbreak

> { "id":0, "method":"Network.getResponseBody", "params":{ "requestId":"28781.18" } }

61

Page 123: ChromeDriver Jailbreak

< { "id":0, "error":{ "code":-32000, "message":"No resource with given identifier found" } }

> { "id":0, "method":"Network.getResponseBody", "params":{ "requestId":"28781.18" } }

61

Page 124: ChromeDriver Jailbreak
Page 125: ChromeDriver Jailbreak

63

Page 126: ChromeDriver Jailbreak

+-+ |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

Page 127: ChromeDriver Jailbreak

+-+ |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

Page 128: ChromeDriver Jailbreak

ChromeDriver set-up

65

Page 129: ChromeDriver Jailbreak

{'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

Page 130: ChromeDriver Jailbreak

DevTools set-up

66

Page 131: ChromeDriver Jailbreak

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

Page 132: ChromeDriver Jailbreak

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

Page 133: ChromeDriver Jailbreak

> { "id":1, "method":"Network.enable", "params":{} }

ChromeDriver

67

Page 134: ChromeDriver Jailbreak

> { "id":1, "method":"Network.enable", "params":{} }

ChromeDriver

> { "id":3, "method":"Network.enable", "params":{ "maxTotalBufferSize":10000000, "maxResourceBufferSize":5000000 } }

DevTools

67

Page 135: ChromeDriver Jailbreak

Финальная логика

✦ Передать chrome-wrapper в binary в ChromeOptions

✦ Включить Performance log в тестах

✦ Получить тело ответа для всех запросов

✦ Конвертировать Performance log в HAR

✦ Добавить ответы в HAR

68

Page 136: ChromeDriver Jailbreak

Финальная логика

✦ Передать chrome-wrapper.sh в binary в ChromeOptions

✦ Включить Performance log в тестах

✦ Отправить “правильный” Network.enable

✦ Получить тело ответа для всех запросов

✦ Конвертировать Performance log в HAR

✦ Добавить ответы в HAR

69

Page 137: ChromeDriver Jailbreak

Page 138: ChromeDriver Jailbreak

…?

Page 139: ChromeDriver Jailbreak

Оно работает!

Page 140: ChromeDriver Jailbreak

– Саша, у меня падает тест

Page 141: ChromeDriver Jailbreak

– В нетворке пусто

Page 142: ChromeDriver Jailbreak

– Руками не воспроизводится

Page 143: ChromeDriver Jailbreak

Варианты ответа

✦ Остановить тест за шаг до падения, последний шаг проделать вручную (с открытыми DevTools)

✦ Поставить прокси

✦ ???

75

Page 144: ChromeDriver Jailbreak

Варианты ответа

✦ Остановить тест за шаг до падения, последний шаг проделать вручную (с открытыми DevTools)

✦ Поставить прокси

✦ Можно получить HAR

76

Page 145: ChromeDriver Jailbreak

Но это ещё не всё

Page 146: ChromeDriver Jailbreak

– В нетворке пусто

Page 147: ChromeDriver Jailbreak

– В нетворке пусто

Почему?

Page 148: ChromeDriver Jailbreak

+-+ | | |C| +----------+ |h| | DevTools | |r| +----------+ |o| |m| |e| | | +-+

79

Page 149: ChromeDriver Jailbreak

+-+ | | |C| +----------+ |h| | DevTools | |r| +----------+ |o| |m| |e| | | +-+

Network.enable

79

Page 150: ChromeDriver Jailbreak

+-+ | | |C| +----------+ |h| | DevTools | |r| +----------+ |o| |m| |e| | | +-+

80

Page 151: ChromeDriver Jailbreak

+-+ | | |C| +----------+ |h| | DevTools | |r| +----------+ |o| |m| |e| | | +-+

request

80

Page 152: ChromeDriver Jailbreak

+-+ | | |C| +----------+ |h| | DevTools | |r| +----------+ |o| |m| |e| | | +-+

request

80

Page 153: ChromeDriver Jailbreak

+-+ | | |C| +----------+ |h| | DevTools | |r| +----------+ |o| |m| |e| | | +-+

response

81

Page 154: ChromeDriver Jailbreak

+-+ | | |C| +----------+ |h| | DevTools | |r| +----------+ |o| |m| |e| | | +-+

response

81

Page 155: ChromeDriver Jailbreak

82

Page 156: ChromeDriver Jailbreak

83

Page 157: ChromeDriver Jailbreak

84

Page 158: ChromeDriver Jailbreak

85

Page 159: ChromeDriver Jailbreak

86

Page 160: ChromeDriver Jailbreak

+----------+ +-+ | Client 1 | | | +----------+ |C| |h| |r| |o| +----------+ |m| | Client 2 | |e| +----------+ | | +-+

87

Page 161: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

88

Page 162: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

89

Page 163: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

89

Page 164: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

89

Page 165: ChromeDriver Jailbreak

https://youtu.be/JDtuXAptypY

Page 166: ChromeDriver Jailbreak

Варианты ответа

✦ Остановить тест за шаг до падения, последний шаг проделать вручную (с открытыми DevTools)

✦ Поставить прокси

✦ Можно получить HAR

91

Page 167: ChromeDriver Jailbreak

Варианты ответа

✦ Остановить тест за шаг до падения, последний шаг проделать вручную (с открытыми DevTools)

✦ Поставить прокси

✦ Можно получить HAR

✦ В нетворке есть всё

92

Page 168: ChromeDriver Jailbreak

Круто!

Page 169: ChromeDriver Jailbreak

– Круто!

Page 170: ChromeDriver Jailbreak

– А как посмотреть как сам тест идёт?

Page 171: ChromeDriver Jailbreak

– Ещё одно окно — неудобно

Page 172: ChromeDriver Jailbreak

Chrome Remote debugger

https://developers.google.com/web/tools/chrome-devtools/remote-debugging/

Page 173: ChromeDriver Jailbreak

Headless Chrome

https://bugs.chromium.org/p/chromium/issues/detail?id=546953

Page 174: ChromeDriver Jailbreak

Headless Chrome

99

Page 175: ChromeDriver Jailbreak

Headless Chrome

99

https://chrome-devtools-frontend.appspot.com /serve_file /${hash} /${devtoolsFrontendUrl} &remoteFrontend=true

Page 176: ChromeDriver Jailbreak

Headless Chrome

99

https://chrome-devtools-frontend.appspot.com /serve_file /${hash} /${devtoolsFrontendUrl} &remoteFrontend=true

Page 177: ChromeDriver Jailbreak

100

/json/list

[{ "id": "…", "webSocketDebuggerUrl": "…", "devtoolsFrontendUrl": "…", … }, …]

Headless Chrome

Page 178: ChromeDriver Jailbreak

100

/json/list

[{ "id": "…", "webSocketDebuggerUrl": "…", "devtoolsFrontendUrl": "…", … }, …]

Headless Chrome

Page 179: ChromeDriver Jailbreak

101

/json/version

{ "Browser": "Chrome/54.0.2840.98", "Protocol-Version": "1.2", "User-Agent": "…", "WebKit-Version": "537.36 (@8ee402c…ad)" }

Headless Chrome

Page 180: ChromeDriver Jailbreak

101

/json/version

{ "Browser": "Chrome/54.0.2840.98", "Protocol-Version": "1.2", "User-Agent": "…", "WebKit-Version": "537.36 (@8ee402c…ad)" }

Headless Chrome

Page 181: ChromeDriver Jailbreak

101

/json/version

{ "Browser": "Chrome/54.0.2840.98", "Protocol-Version": "1.2", "User-Agent": "…", "WebKit-Version": "537.36 (@8ee402c…ad)" }

Headless Chrome

hash

Page 182: ChromeDriver Jailbreak

?

Page 183: ChromeDriver Jailbreak
Page 184: ChromeDriver Jailbreak

https://youtu.be/X-dL_eKB1VE

Page 185: ChromeDriver Jailbreak

One more thing…

Page 186: ChromeDriver Jailbreak

Что он может ещё?

Page 187: ChromeDriver Jailbreak

+-+ +-+ +-+ +--------+ +------------+ |P| |C| |T|<---->|Selenium|<---->|ChromeDriver|<->|r| |h| |e| +--------+ +------------+ |o|<->|r| |s| |x| |o| |t|<------------------------------------->|y| |m| +-+ +-+ |e| +-+

WebSocket Connection

107

Page 188: ChromeDriver Jailbreak

Технические детали

Page 189: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

109

Page 190: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

{ “id”: 1, …}

109

Page 191: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

{ “id”: 1}

{ “id”: 1, …}

109

Page 192: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

{ “id”: 1}

110

Page 193: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

{ “id”: 1}

¯\_(�)_/¯

"

110

Page 194: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

111

Page 195: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

{ “id”: 19, …}

{ “id”: 19, …}

111

Page 196: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

{ “id”: 19}

{ “id”: 19, …}

{ “id”: 19, …}

111

Page 197: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

{ “id”: 19}×2

{ “id”: 19, …}

{ “id”: 19, …}

111

Page 198: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

{ “id”: 19}

112

Page 199: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

{ “id”: 19}

¯\_(�)_/¯

"

112

Page 200: ChromeDriver Jailbreak

ID?

113

Page 201: ChromeDriver Jailbreak

ID2147483647Max:

114

Page 202: ChromeDriver Jailbreak

ID2³¹-1

115

Page 203: ChromeDriver Jailbreak

ID19

116

Page 204: ChromeDriver Jailbreak

0000000000000000000000000010011id = 19

117

Page 205: ChromeDriver Jailbreak

0000000000000000000000000010011id = 19client id

118

Page 206: ChromeDriver Jailbreak

0000000010000000000000000010011id = 19client id

119

Page 207: ChromeDriver Jailbreak

0000000010000000000000000010011id = 19client id

4194323

=119

Page 208: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

120

Page 209: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

{ “id”: 19, …}

{ “id”: 19, …}

120

Page 210: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

{ “id”: 19}

{ “id”: 19, …}

{ “id”: 19, …}

120

Page 211: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

{ “id”: 19}

{ “id”: 19, …}

{ “id”: 19, …}{ “id”:

4194323}

120

Page 212: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

{ “id”: 4194323}

121

Page 213: ChromeDriver Jailbreak

+-+ +----------+ | | +-+ | Client 1 | | | | | +----------+ |P| |C| |r| |h| |o| |r| |x| |o| +----------+ |y| |m| | Client 2 | | | |e| +----------+ | | | | +-+ +-+

{ “id”: 19, …}{ “id”:

4194323}

121

Page 214: ChromeDriver Jailbreak

Технические детали

122

Нужно заранее знать количество клиентов (по умолчанию 8)

Page 215: ChromeDriver Jailbreak

Примеры

✦ Network Throttling

https://chromedevtools.github.io/debugger-protocol-viewer/1-2/Network/#method-emulateNetworkConditions

Page 216: ChromeDriver Jailbreak

Примеры

https://chromedevtools.github.io/debugger-protocol-viewer/1-2/Network/#method-emulateNetworkConditions

Page 217: ChromeDriver Jailbreak

Примеры

✦ Network Throttling

✦ CPU Throttling (EXPERIMENTAL)

https://chromedevtools.github.io/debugger-protocol-viewer/tot/Emulation/#method-setCPUThrottlingRate

Page 218: ChromeDriver Jailbreak

Примеры

https://chromedevtools.github.io/debugger-protocol-viewer/tot/Emulation/#method-setCPUThrottlingRate

Page 219: ChromeDriver Jailbreak

> { "id":0, "method":"Emulation.setCPUThrottlingRate", "params":{ "rate": 10 } }

127

Page 220: ChromeDriver Jailbreak

> { "id":0, "method":"Emulation.setCPUThrottlingRate", "params":{ "rate": 10 } }

N times slower

127

Page 221: ChromeDriver Jailbreak

https://youtu.be/NU46EkrRoYo

Page 222: ChromeDriver Jailbreak

– Как запустить тесты на плохом соединении?

Page 223: ChromeDriver Jailbreak

– О! Вы и это уже можете

Page 224: ChromeDriver Jailbreak

Где взять?

Page 225: ChromeDriver Jailbreak

Полезно знать

132

Page 226: ChromeDriver Jailbreak

Полезно знать

✦ devtools-proxy полностью совместим с Selenium

132

Page 227: ChromeDriver Jailbreak

Полезно знать

✦ devtools-proxy полностью совместим с Selenium

✦ Пока нет поддержки Windows

132

Page 228: ChromeDriver Jailbreak

Полезно знать

✦ devtools-proxy полностью совместим с Selenium

✦ Пока нет поддержки Windows

✦ Только для Chromium / Google Chrome

132

Page 229: ChromeDriver Jailbreak

Где взять?

bayandin / devtools-proxy

133

Page 230: ChromeDriver Jailbreak

Планы на будущее

Page 231: ChromeDriver Jailbreak

Планы на будущее

135

Page 232: ChromeDriver Jailbreak

Планы на будущее

135

✦ Научиться останавливаться на debugger / breakpoints

Page 233: ChromeDriver Jailbreak

Планы на будущее

135

✦ Научиться останавливаться на debugger / breakpoints

✦ Научиться получать данные Chrome Push Notification

Page 234: ChromeDriver Jailbreak

https://gauntface.github.io/simple-push-demo/

Page 235: ChromeDriver Jailbreak

https://gauntface.github.io/simple-push-demo/

Page 236: ChromeDriver Jailbreak

Планы на будущее

138

✦ Научиться останавливаться на debugger / breakpoints

✦ Научиться получать данные Chrome Push Notification

Page 237: ChromeDriver Jailbreak

Планы на будущее

138

✦ Научиться останавливаться на debugger / breakpoints

✦ Научиться получать данные Chrome Push Notification

✦ Поддержка Android

Page 238: ChromeDriver Jailbreak

Планы на будущее

138

✦ Научиться останавливаться на debugger / breakpoints

✦ Научиться получать данные Chrome Push Notification

✦ Поддержка Android

✦ Поддержка Windows (для chrome-wrapper)

Page 239: ChromeDriver Jailbreak

Планы на будущее

138

✦ Научиться останавливаться на debugger / breakpoints

✦ Научиться получать данные Chrome Push Notification

✦ Поддержка Android

✦ Поддержка Windows (для chrome-wrapper)

✦ Поддержка Firefox / Edge

Page 240: ChromeDriver Jailbreak

Сегодня я многое понял…

139

Page 241: ChromeDriver Jailbreak

Сегодня я многое понял…

✦ Как видеть HTTP запросы во время прохождения теста

139

Page 242: ChromeDriver Jailbreak

Сегодня я многое понял…

✦ Как видеть HTTP запросы во время прохождения теста

✦ Как видеть как идёт тест

139

Page 243: ChromeDriver Jailbreak

Сегодня я многое понял…

✦ Как видеть HTTP запросы во время прохождения теста

✦ Как видеть как идёт тест

✦ Использовать любые Chrome Debugging Protocol методы

139

Page 244: ChromeDriver Jailbreak

Спасибо!

Page 245: ChromeDriver Jailbreak

BadooDev & BadooTech (en)

Badoo

tech.badoo.com

techblog.badoo.com (en)

bayandin / devtools-proxyabayandin

Page 246: ChromeDriver Jailbreak

The original, largest and leading dating network