0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>theme: gaia class:</p>
1
<p>theme: gaia class:</p>
2
<ul><li>lead</li>
2
<ul><li>lead</li>
3
<li>invert paginate: true</li>
3
<li>invert paginate: true</li>
4
</ul><h2>JSDOM</h2>
4
</ul><h2>JSDOM</h2>
5
<h2>Hexlet</h2>
5
<h2>Hexlet</h2>
6
<h2>Проблематика</h2>
6
<h2>Проблематика</h2>
7
<ul><li>вам нужно окружение, позволяющее запускать браузер</li>
7
<ul><li>вам нужно окружение, позволяющее запускать браузер</li>
8
<li>тесты медленные</li>
8
<li>тесты медленные</li>
9
</ul><h2>Что есть JSDOM</h2>
9
</ul><h2>Что есть JSDOM</h2>
10
<ul><li>библиотека, которая анализирует и взаимодействует с собранным HTML так же, как браузер</li>
10
<ul><li>библиотека, которая анализирует и взаимодействует с собранным HTML так же, как браузер</li>
11
<li>jsdom - это чистая JavaScript-реализация многих веб-стандартов, в частности стандартов WHATWG DOM и HTML, для использования с Node.js</li>
11
<li>jsdom - это чистая JavaScript-реализация многих веб-стандартов, в частности стандартов WHATWG DOM и HTML, для использования с Node.js</li>
12
<li>это не настоящий браузер,<strong>НО</strong></li>
12
<li>это не настоящий браузер,<strong>НО</strong></li>
13
<li>она реализует веб-стандарты так же, как это делают браузеры</li>
13
<li>она реализует веб-стандарты так же, как это делают браузеры</li>
14
</ul><h2>Подключение</h2>
14
</ul><h2>Подключение</h2>
15
<h2>Инициализация</h2>
15
<h2>Инициализация</h2>
16
<h2>Параметры</h2>
16
<h2>Параметры</h2>
17
<h2>Скрипты в html</h2>
17
<h2>Скрипты в html</h2>
18
<h2>Запуск скриптов</h2>
18
<h2>Запуск скриптов</h2>
19
<ul><li>resources: 'usable' - можно ли загружать ресурсы вроде js, css, изображения и пр.</li>
19
<ul><li>resources: 'usable' - можно ли загружать ресурсы вроде js, css, изображения и пр.</li>
20
<li>runScripts: 'dangerously' - можно ли запускать скрипты</li>
20
<li>runScripts: 'dangerously' - можно ли запускать скрипты</li>
21
</ul><h2>Флоу</h2>
21
</ul><h2>Флоу</h2>
22
<h2>Установка</h2>
22
<h2>Установка</h2>
23
<h2>Экземпляр JSDOM</h2>
23
<h2>Экземпляр JSDOM</h2>
24
<h2>Установка параметров</h2>
24
<h2>Установка параметров</h2>
25
<h2>Установка window и document</h2>
25
<h2>Установка window и document</h2>
26
<h2>Пишем тесты</h2>
26
<h2>Пишем тесты</h2>
27
<h4>А можно и так</h4>
27
<h4>А можно и так</h4>
28
<h2>Загрузка по URL</h2>
28
<h2>Загрузка по URL</h2>
29
<h2>Альтернатива</h2>
29
<h2>Альтернатива</h2>
30
<h2>Визуальная составляющая</h2>
30
<h2>Визуальная составляющая</h2>
31
<ul><li>jsdom не умеет рендерить визуальное содержание</li>
31
<ul><li>jsdom не умеет рендерить визуальное содержание</li>
32
<li>не отображает верстку<ul><li>вы не можете перетащить ползунок и проверить, что что-то изменилось</li>
32
<li>не отображает верстку<ul><li>вы не можете перетащить ползунок и проверить, что что-то изменилось</li>
33
<li>то же касается бесконечной прокрутки</li>
33
<li>то же касается бесконечной прокрутки</li>
34
<li>или :hover, :active</li>
34
<li>или :hover, :active</li>
35
<li>и прочего</li>
35
<li>и прочего</li>
36
</ul></li>
36
</ul></li>
37
</ul><h2>Виртуальные консоли</h2>
37
</ul><h2>Виртуальные консоли</h2>
38
<ul><li>Сколько всего есть консолей?<ul><li>3</li>
38
<ul><li>Сколько всего есть консолей?<ul><li>3</li>
39
<li>console.log из Node.js</li>
39
<li>console.log из Node.js</li>
40
<li>Консоль страницы</li>
40
<li>Консоль страницы</li>
41
<li>Консоль jsdom</li>
41
<li>Консоль jsdom</li>
42
</ul></li>
42
</ul></li>
43
</ul><ul><li>По умолчанию конструктор JSDOM вернет экземпляр с виртуальной консолью, который пересылает все свои данные в консоль Node.js</li>
43
</ul><ul><li>По умолчанию конструктор JSDOM вернет экземпляр с виртуальной консолью, который пересылает все свои данные в консоль Node.js</li>
44
<li>virtualConsole.sendTo(console);</li>
44
<li>virtualConsole.sendTo(console);</li>
45
</ul><ul><li>особое событие jsdomError отображает:<ul><li>Ошибки загрузки или парсинга ресурсов (скрипты, стили, фреймы, и i-фреймы)</li>
45
</ul><ul><li>особое событие jsdomError отображает:<ul><li>Ошибки загрузки или парсинга ресурсов (скрипты, стили, фреймы, и i-фреймы)</li>
46
<li>Ошибки при выполнении скрипта, которые не видит обработчик событий window onerror, который возвращает true или вызывает event.preventDefault()</li>
46
<li>Ошибки при выполнении скрипта, которые не видит обработчик событий window onerror, который возвращает true или вызывает event.preventDefault()</li>
47
<li>Не реализованные ошибки, возникающие в результате вызовов методов вроде window.alert, которого нет в jsdom, но который установлен для веб-совместимости</li>
47
<li>Не реализованные ошибки, возникающие в результате вызовов методов вроде window.alert, которого нет в jsdom, но который установлен для веб-совместимости</li>
48
</ul></li>
48
</ul></li>
49
<li>virtualConsole.sendTo(console, { omitJSDOMErrors: true });</li>
49
<li>virtualConsole.sendTo(console, { omitJSDOMErrors: true });</li>
50
</ul><h2>Изменения перед парсингом</h2>
50
</ul><h2>Изменения перед парсингом</h2>
51
<p>Это особенно полезно, если вы хотите каким-либо образом изменить среду, например, добавив адаптеры для API веб-платформы, которые jsdom не поддерживает</p>
51
<p>Это особенно полезно, если вы хотите каким-либо образом изменить среду, например, добавив адаптеры для API веб-платформы, которые jsdom не поддерживает</p>
52
<ul><li>JSDOM.fromURL</li>
52
<ul><li>JSDOM.fromURL</li>
53
<li>JSDOM.fromFile</li>
53
<li>JSDOM.fromFile</li>
54
<li>JSDOM.fragment</li>
54
<li>JSDOM.fragment</li>
55
<li>Поддержка canvas с помощью npm-пакета node-canvas</li>
55
<li>Поддержка canvas с помощью npm-пакета node-canvas</li>
56
<li>window.close() убивает window.setTimeout()</li>
56
<li>window.close() убивает window.setTimeout()</li>
57
<li>Запускайте в браузере, НО</li>
57
<li>Запускайте в браузере, НО</li>
58
<li>используйте прокси</li>
58
<li>используйте прокси</li>
59
</ul><h2>Подводные камни</h2>
59
</ul><h2>Подводные камни</h2>
60
<ul><li>Фундаментальное ограничение для асинхронной загрузки скриптов</li>
60
<ul><li>Фундаментальное ограничение для асинхронной загрузки скриптов</li>
61
<li>Нет навигации</li>
61
<li>Нет навигации</li>
62
<li>Нет верстки: getBoundingClientRects, offsetTop</li>
62
<li>Нет верстки: getBoundingClientRects, offsetTop</li>
63
</ul><h2>Глобальные свойства</h2>
63
</ul><h2>Глобальные свойства</h2>
64
<ul><li><p>Мы используем navigator.userAgent.indexOf('Chrome') > -1 вместо window.navigator.userAgent.indexOf('Chrome') > -1</p>
64
<ul><li><p>Мы используем navigator.userAgent.indexOf('Chrome') > -1 вместо window.navigator.userAgent.indexOf('Chrome') > -1</p>
65
</li>
65
</li>
66
<li><p>ReferenceError: navigator is not defined</p>
66
<li><p>ReferenceError: navigator is not defined</p>
67
</li>
67
</li>
68
</ul><h2>jest-dom</h2>
68
</ul><h2>jest-dom</h2>
69
<ul><li>Убирает дублирующийся код, добавляет абстракцию<ul><li>аттрибуты</li>
69
<ul><li>Убирает дублирующийся код, добавляет абстракцию<ul><li>аттрибуты</li>
70
<li>текст</li>
70
<li>текст</li>
71
<li>css классы</li>
71
<li>css классы</li>
72
<li>и т.д.</li>
72
<li>и т.д.</li>
73
</ul></li>
73
</ul></li>
74
<li>Расширяет матчеры jest</li>
74
<li>Расширяет матчеры jest</li>
75
<li>Декларативность</li>
75
<li>Декларативность</li>
76
</ul><h2>Testing Library data-testid</h2>
76
</ul><h2>Testing Library data-testid</h2>
77
<p>eslint-plugin-jest-dom</p>
77
<p>eslint-plugin-jest-dom</p>
78
78