ОК, так что я проделал некоторую работу над этим и придумал это решение, которое работает для того, что я хочу, без необходимости устанавливать общий селектор для захвата в каждом отдельном сценарии.
Первоначальная цель состояла в том, чтобы захватить мои компоненты React, отображаемые в сборнике рассказов, изолированно (т. Е. Не мешать таблицам уценки или поддержки).
Просто для справки по всем, это соответствующие зависимости и версиичто я использую (скопировал и вставил из моих проектов package.json
файл):
"@storybook/addon-actions": "^3.4.8",
"@storybook/addon-info": "^3.4.8",
"@storybook/addon-links": "^3.4.8",
"@storybook/addon-options": "^3.4.8",
"@storybook/addons": "^3.4.8",
"@storybook/react": "^3.4.8",
"backstopjs": "^3.2.19",
"prop-types": "^15.6.2",
"react": "^16.4.1",
"react-dom": "^16.4.1"
В качестве дальнейшего примечания я использую puppeteer
с backstopjs
.
Первой проблемой, которую мне пришлось обойти, был тот факт, что Storybook отображает ваш компонент, уценку и таблицы поддержки внутри внутреннего элемента <iframe>
на каждой странице.Это вызвало проблему с backstopjs
, поскольку область видимости CSS не имела понятия внутреннего document
внутри этого внутреннего <iframe>
.Если бы мой компонент был больше, чем тот, который был виден в непосредственном пользовательском интерфейсе, он бы не понял, что внутренний document
длиннее, чем внешний.В дополнение к этому я не смог установить hideSelectors
или removeSelectors
для каких-либо компонентов внутри этого внутреннего <iframe>
, так как он был вне области видимости.
Итак, первое крупное открытие, которое помоглоизолировать, что внутренний <iframe>
на своей собственной странице должен был добавить iframe.html
к URL-адресу следующим образом (например - предположим, что вы используете Storybook на localhost
через порт по умолчанию):
http://localhost:6006/iframe.html?selectedKind=...
Это изолирует это ранее внутреннее <iframe>
на его собственной странице без появления левой панели меню.Таким образом, теперь я мог скрывать и удалять селекторы так, как хотел, поскольку теперь все было в поле зрения.Уценка Storybook и таблицы поддержки, которые отображаются на странице, удобно заключены в один элемент <div>
.Уникальный селектор CSS, который я использовал для указания на этот элемент <div>
, выглядит следующим образом:
div[id="root"] > div > div > div[style*="font-family: -apple-system"]
Итак, вместо того, чтобы настраивать общий селектор для каждого сценария, я решил сделать следующее:чтобы вызвать общий onReadyScript
в моем backstop.json
файле конфигурации следующим образом:
{
"id": "suite_name",
"viewports": [
...
],
"onReadyScript": "my-on-ready-script.js",
"scenarios": [
...
],
...
}
Мой скрипт был настроен для удаления элемента markdown и prop-tables <div>
следующим образом:
module.exports = async function (puppeteer) {
/* Remove the markdown and prop tables from the Storybook preview panel */
await puppeteer
.$eval('div[id="root"] > div > div > div[style*="font-family: -apple-system"]', (markdownAndPropTables) => {
markdownAndPropTables.parentNode.remove();
});
};
Это оставляет мой компонент полностью изолированным на каждой странице, и backstopjs
может захватить этот компонент самостоятельно.
Это лучшее решение, которое я когда-либо делалв состоянии найти для достижения моих целей с этим.Я предлагаю это как потенциальное решение для всех остальных.Надеюсь, в этом есть что-то, что поможет кому-то еще, желающему сделать то же самое, что я хотел!