|
2 | 2 |
|
3 | 3 | 'use strict';
|
4 | 4 |
|
| 5 | +const {runOnlyForReactRange} = require('./utils'); |
5 | 6 | const listAppUtils = require('./list-app-utils');
|
6 | 7 | const devToolsUtils = require('./devtools-utils');
|
7 | 8 | const {test, expect} = require('@playwright/test');
|
8 | 9 | const config = require('../../playwright.config');
|
| 10 | +const semver = require('semver'); |
9 | 11 | test.use(config);
|
10 | 12 | test.describe('Components', () => {
|
11 | 13 | let page;
|
12 | 14 |
|
13 | 15 | test.beforeEach(async ({browser}) => {
|
14 | 16 | page = await browser.newPage();
|
15 | 17 |
|
16 |
| - await page.goto('http://localhost:8080/e2e.html', { |
| 18 | + await page.goto(config.use.url, { |
17 | 19 | waitUntil: 'domcontentloaded',
|
18 | 20 | });
|
19 | 21 |
|
@@ -51,32 +53,60 @@ test.describe('Components', () => {
|
51 | 53 | // Select the first list item in DevTools.
|
52 | 54 | await devToolsUtils.selectElement(page, 'ListItem', 'List\nApp');
|
53 | 55 |
|
| 56 | + // Prop names/values may not be editable based on the React version. |
| 57 | + // If they're not editable, make sure they degrade gracefully |
| 58 | + const isEditableName = semver.gte(config.use.react_version, '17.0.0'); |
| 59 | + const isEditableValue = semver.gte(config.use.react_version, '16.8.0'); |
| 60 | + |
54 | 61 | // Then read the inspected values.
|
55 |
| - const [propName, propValue, sourceText] = await page.evaluate(() => { |
56 |
| - const {createTestNameSelector, findAllNodes} = window.REACT_DOM_DEVTOOLS; |
57 |
| - const container = document.getElementById('devtools'); |
| 62 | + const [propName, propValue, sourceText] = await page.evaluate( |
| 63 | + isEditable => { |
| 64 | + const { |
| 65 | + createTestNameSelector, |
| 66 | + findAllNodes, |
| 67 | + } = window.REACT_DOM_DEVTOOLS; |
| 68 | + const container = document.getElementById('devtools'); |
58 | 69 |
|
59 |
| - const editableName = findAllNodes(container, [ |
60 |
| - createTestNameSelector('InspectedElementPropsTree'), |
61 |
| - createTestNameSelector('EditableName'), |
62 |
| - ])[0]; |
63 |
| - const editableValue = findAllNodes(container, [ |
64 |
| - createTestNameSelector('InspectedElementPropsTree'), |
65 |
| - createTestNameSelector('EditableValue'), |
66 |
| - ])[0]; |
67 |
| - const source = findAllNodes(container, [ |
68 |
| - createTestNameSelector('InspectedElementView-Source'), |
69 |
| - ])[0]; |
| 70 | + // Get name of first prop |
| 71 | + const selectorName = isEditable.name |
| 72 | + ? 'EditableName' |
| 73 | + : 'NonEditableName'; |
| 74 | + const nameElement = findAllNodes(container, [ |
| 75 | + createTestNameSelector('InspectedElementPropsTree'), |
| 76 | + createTestNameSelector(selectorName), |
| 77 | + ])[0]; |
| 78 | + const name = isEditable.name |
| 79 | + ? nameElement.value |
| 80 | + : nameElement.innerText; |
| 81 | + |
| 82 | + // Get value of first prop |
| 83 | + const selectorValue = isEditable.value |
| 84 | + ? 'EditableValue' |
| 85 | + : 'NonEditableValue'; |
| 86 | + const valueElement = findAllNodes(container, [ |
| 87 | + createTestNameSelector('InspectedElementPropsTree'), |
| 88 | + createTestNameSelector(selectorValue), |
| 89 | + ])[0]; |
| 90 | + const source = findAllNodes(container, [ |
| 91 | + createTestNameSelector('InspectedElementView-Source'), |
| 92 | + ])[0]; |
| 93 | + const value = isEditable.value |
| 94 | + ? valueElement.value |
| 95 | + : valueElement.innerText; |
70 | 96 |
|
71 |
| - return [editableName.value, editableValue.value, source.innerText]; |
72 |
| - }); |
| 97 | + return [name, value, source.innerText]; |
| 98 | + }, |
| 99 | + {name: isEditableName, value: isEditableValue} |
| 100 | + ); |
73 | 101 |
|
74 | 102 | expect(propName).toBe('label');
|
75 | 103 | expect(propValue).toBe('"one"');
|
76 |
| - expect(sourceText).toContain('ListApp.js'); |
| 104 | + expect(sourceText).toMatch(/ListApp[a-zA-Z]*\.js/); |
77 | 105 | });
|
78 | 106 |
|
79 | 107 | test('should allow props to be edited', async () => {
|
| 108 | + runOnlyForReactRange('>=16.8'); |
| 109 | + |
80 | 110 | // Select the first list item in DevTools.
|
81 | 111 | await devToolsUtils.selectElement(page, 'ListItem', 'List\nApp');
|
82 | 112 |
|
@@ -109,6 +139,8 @@ test.describe('Components', () => {
|
109 | 139 | });
|
110 | 140 |
|
111 | 141 | test('should load and parse hook names for the inspected element', async () => {
|
| 142 | + runOnlyForReactRange('>=16.8'); |
| 143 | + |
112 | 144 | // Select the List component DevTools.
|
113 | 145 | await devToolsUtils.selectElement(page, 'List', 'App');
|
114 | 146 |
|
@@ -162,19 +194,23 @@ test.describe('Components', () => {
|
162 | 194 | });
|
163 | 195 | }
|
164 | 196 |
|
165 |
| - await page.evaluate(() => { |
166 |
| - const {createTestNameSelector, focusWithin} = window.REACT_DOM_DEVTOOLS; |
167 |
| - const container = document.getElementById('devtools'); |
| 197 | + async function focusComponentSearch() { |
| 198 | + await page.evaluate(() => { |
| 199 | + const {createTestNameSelector, focusWithin} = window.REACT_DOM_DEVTOOLS; |
| 200 | + const container = document.getElementById('devtools'); |
168 | 201 |
|
169 |
| - focusWithin(container, [ |
170 |
| - createTestNameSelector('ComponentSearchInput-Input'), |
171 |
| - ]); |
172 |
| - }); |
| 202 | + focusWithin(container, [ |
| 203 | + createTestNameSelector('ComponentSearchInput-Input'), |
| 204 | + ]); |
| 205 | + }); |
| 206 | + } |
173 | 207 |
|
| 208 | + await focusComponentSearch(); |
174 | 209 | page.keyboard.insertText('List');
|
175 | 210 | let count = await getComponentSearchResultsCount();
|
176 | 211 | expect(count).toBe('1 | 4');
|
177 | 212 |
|
| 213 | + await focusComponentSearch(); |
178 | 214 | page.keyboard.insertText('Item');
|
179 | 215 | count = await getComponentSearchResultsCount();
|
180 | 216 | expect(count).toBe('1 | 3');
|
|
0 commit comments