Testing React DevTools Profiler Snapshot Navigation in facebook/react
This test suite validates the React DevTools Profiler functionality, focusing on recording and navigating through render snapshots. It ensures proper profiling behavior for React applications version 16.5 and above.
Test Coverage Overview
Implementation Analysis
Technical Details
Best Practices Demonstrated
facebook/react
packages/react-devtools-inline/__tests__/__e2e__/profiler.test.js
/** @flow */
'use strict';
const {runOnlyForReactRange} = require('./utils');
const listAppUtils = require('./list-app-utils');
const devToolsUtils = require('./devtools-utils');
const {test, expect} = require('@playwright/test');
const config = require('../../playwright.config');
test.use(config);
test.describe('Profiler', () => {
let page;
test.beforeEach(async ({browser}) => {
page = await browser.newPage();
await page.goto(config.use.url, {
waitUntil: 'domcontentloaded',
});
await page.waitForSelector('#iframe');
await devToolsUtils.clickButton(page, 'TabBarButton-profiler');
});
test('should record renders and commits when active', async () => {
// Profiling is only available in 16.5 and over
runOnlyForReactRange('>=16.5');
async function getSnapshotSelectorText() {
return await page.evaluate(() => {
const {createTestNameSelector, findAllNodes} =
window.REACT_DOM_DEVTOOLS;
const container = document.getElementById('devtools');
const input = findAllNodes(container, [
createTestNameSelector('SnapshotSelector-Input'),
])[0];
const label = findAllNodes(container, [
createTestNameSelector('SnapshotSelector-Label'),
])[0];
return `${input.value}${label.innerText}`;
});
}
async function clickButtonAndVerifySnapshotSelectorText(
buttonTagName,
expectedText
) {
await devToolsUtils.clickButton(page, buttonTagName);
const text = await getSnapshotSelectorText();
expect(text).toBe(expectedText);
}
await devToolsUtils.clickButton(page, 'ProfilerToggleButton');
await listAppUtils.addItem(page, 'four');
await listAppUtils.addItem(page, 'five');
await listAppUtils.addItem(page, 'six');
await devToolsUtils.clickButton(page, 'ProfilerToggleButton');
await page.waitForFunction(() => {
const {createTestNameSelector, findAllNodes} = window.REACT_DOM_DEVTOOLS;
const container = document.getElementById('devtools');
const input = findAllNodes(container, [
createTestNameSelector('SnapshotSelector-Input'),
]);
return input.length === 1;
});
const text = await getSnapshotSelectorText();
expect(text).toBe('1 / 3');
await clickButtonAndVerifySnapshotSelectorText(
'SnapshotSelector-NextButton',
'2 / 3'
);
await clickButtonAndVerifySnapshotSelectorText(
'SnapshotSelector-NextButton',
'3 / 3'
);
await clickButtonAndVerifySnapshotSelectorText(
'SnapshotSelector-NextButton',
'1 / 3'
);
await clickButtonAndVerifySnapshotSelectorText(
'SnapshotSelector-PreviousButton',
'3 / 3'
);
await clickButtonAndVerifySnapshotSelectorText(
'SnapshotSelector-PreviousButton',
'2 / 3'
);
await clickButtonAndVerifySnapshotSelectorText(
'SnapshotSelector-PreviousButton',
'1 / 3'
);
await clickButtonAndVerifySnapshotSelectorText(
'SnapshotSelector-PreviousButton',
'3 / 3'
);
});
});