Best JavaScript code snippet using playwright-internal
ReactSuspensePlaceholder-test.internal.js
1/**2 * Copyright (c) 2013-present, Facebook, Inc.3 *4 * This source code is licensed under the MIT license found in the5 * LICENSE file in the root directory of this source tree.6 *7 * @emails react-core8 * @jest-environment node9 */10// TODO: This does nothing since it was migrated from noop renderer to test11// renderer! Switch back to noop renderer, or add persistent mode to test12// renderer, or merge the two renderers into one somehow.13// runPlaceholderTests('ReactSuspensePlaceholder (mutation)', () =>14// require('react-noop-renderer'),15// );16runPlaceholderTests('ReactSuspensePlaceholder (persistence)', () =>17 require('react-noop-renderer/persistent'),18);19function runPlaceholderTests(suiteLabel, loadReactNoop) {20 let advanceTimeBy;21 let mockNow;22 let Profiler;23 let React;24 let ReactTestRenderer;25 let ReactFeatureFlags;26 let ReactCache;27 let Suspense;28 let TextResource;29 let textResourceShouldFail;30 describe(suiteLabel, () => {31 beforeEach(() => {32 jest.resetModules();33 let currentTime = 0;34 mockNow = jest.fn().mockImplementation(() => currentTime);35 global.Date.now = mockNow;36 advanceTimeBy = amount => {37 currentTime += amount;38 };39 ReactFeatureFlags = require('shared/ReactFeatureFlags');40 ReactFeatureFlags.debugRenderPhaseSideEffectsForStrictMode = false;41 ReactFeatureFlags.enableProfilerTimer = true;42 ReactFeatureFlags.replayFailedUnitOfWorkWithInvokeGuardedCallback = false;43 React = require('react');44 ReactTestRenderer = require('react-test-renderer');45 ReactTestRenderer.unstable_setNowImplementation(mockNow);46 ReactCache = require('react-cache');47 Profiler = React.unstable_Profiler;48 Suspense = React.Suspense;49 TextResource = ReactCache.unstable_createResource(([text, ms = 0]) => {50 let listeners = null;51 let status = 'pending';52 let value = null;53 return {54 then(resolve, reject) {55 switch (status) {56 case 'pending': {57 if (listeners === null) {58 listeners = [{resolve, reject}];59 setTimeout(() => {60 if (textResourceShouldFail) {61 ReactTestRenderer.unstable_yield(62 `Promise rejected [${text}]`,63 );64 status = 'rejected';65 value = new Error('Failed to load: ' + text);66 listeners.forEach(listener => listener.reject(value));67 } else {68 ReactTestRenderer.unstable_yield(69 `Promise resolved [${text}]`,70 );71 status = 'resolved';72 value = text;73 listeners.forEach(listener => listener.resolve(value));74 }75 }, ms);76 } else {77 listeners.push({resolve, reject});78 }79 break;80 }81 case 'resolved': {82 resolve(value);83 break;84 }85 case 'rejected': {86 reject(value);87 break;88 }89 }90 },91 };92 }, ([text, ms]) => text);93 textResourceShouldFail = false;94 });95 function Text({fakeRenderDuration = 0, text = 'Text'}) {96 advanceTimeBy(fakeRenderDuration);97 ReactTestRenderer.unstable_yield(text);98 return text;99 }100 function AsyncText({fakeRenderDuration = 0, ms, text}) {101 advanceTimeBy(fakeRenderDuration);102 try {103 TextResource.read([text, ms]);104 ReactTestRenderer.unstable_yield(text);105 return text;106 } catch (promise) {107 if (typeof promise.then === 'function') {108 ReactTestRenderer.unstable_yield(`Suspend! [${text}]`);109 } else {110 ReactTestRenderer.unstable_yield(`Error! [${text}]`);111 }112 throw promise;113 }114 }115 it('times out children that are already hidden', () => {116 class HiddenText extends React.PureComponent {117 render() {118 const text = this.props.text;119 ReactTestRenderer.unstable_yield(text);120 return <span hidden={true}>{text}</span>;121 }122 }123 function App(props) {124 return (125 <Suspense maxDuration={500} fallback={<Text text="Loading..." />}>126 <HiddenText text="A" />127 <span>128 <AsyncText ms={1000} text={props.middleText} />129 </span>130 <span>131 <Text text="C" />132 </span>133 </Suspense>134 );135 }136 // Initial mount137 const root = ReactTestRenderer.create(<App middleText="B" />, {138 unstable_isConcurrent: true,139 });140 expect(root).toFlushAndYield(['A', 'Suspend! [B]', 'C', 'Loading...']);141 expect(root).toMatchRenderedOutput(null);142 jest.advanceTimersByTime(1000);143 expect(ReactTestRenderer).toHaveYielded(['Promise resolved [B]']);144 expect(root).toFlushAndYield(['A', 'B', 'C']);145 expect(root).toMatchRenderedOutput(146 <React.Fragment>147 <span hidden={true}>A</span>148 <span>B</span>149 <span>C</span>150 </React.Fragment>,151 );152 // Update153 root.update(<App middleText="B2" />);154 expect(root).toFlushAndYield(['Suspend! [B2]', 'C', 'Loading...']);155 // Time out the update156 jest.advanceTimersByTime(750);157 expect(root).toFlushAndYield([]);158 expect(root).toMatchRenderedOutput('Loading...');159 // Resolve the promise160 jest.advanceTimersByTime(1000);161 expect(ReactTestRenderer).toHaveYielded(['Promise resolved [B2]']);162 expect(root).toFlushAndYield(['B2', 'C']);163 // Render the final update. A should still be hidden, because it was164 // given a `hidden` prop.165 expect(root).toMatchRenderedOutput(166 <React.Fragment>167 <span hidden={true}>A</span>168 <span>B2</span>169 <span>C</span>170 </React.Fragment>,171 );172 });173 it('times out text nodes', async () => {174 function App(props) {175 return (176 <Suspense maxDuration={500} fallback={<Text text="Loading..." />}>177 <Text text="A" />178 <AsyncText ms={1000} text={props.middleText} />179 <Text text="C" />180 </Suspense>181 );182 }183 // Initial mount184 const root = ReactTestRenderer.create(<App middleText="B" />, {185 unstable_isConcurrent: true,186 });187 expect(root).toFlushAndYield(['A', 'Suspend! [B]', 'C', 'Loading...']);188 expect(root).toMatchRenderedOutput(null);189 jest.advanceTimersByTime(1000);190 expect(ReactTestRenderer).toHaveYielded(['Promise resolved [B]']);191 expect(root).toFlushAndYield(['A', 'B', 'C']);192 expect(root).toMatchRenderedOutput('ABC');193 // Update194 root.update(<App middleText="B2" />);195 expect(root).toFlushAndYield(['A', 'Suspend! [B2]', 'C', 'Loading...']);196 // Time out the update197 jest.advanceTimersByTime(750);198 expect(root).toFlushAndYield([]);199 expect(root).toMatchRenderedOutput('Loading...');200 // Resolve the promise201 jest.advanceTimersByTime(1000);202 expect(ReactTestRenderer).toHaveYielded(['Promise resolved [B2]']);203 expect(root).toFlushAndYield(['A', 'B2', 'C']);204 // Render the final update. A should still be hidden, because it was205 // given a `hidden` prop.206 expect(root).toMatchRenderedOutput('AB2C');207 });208 describe('profiler durations', () => {209 let App;210 let onRender;211 beforeEach(() => {212 // Order of parameters: id, phase, actualDuration, treeBaseDuration213 onRender = jest.fn();214 const Fallback = () => {215 ReactTestRenderer.unstable_yield('Fallback');216 advanceTimeBy(10);217 return 'Loading...';218 };219 const Suspending = () => {220 ReactTestRenderer.unstable_yield('Suspending');221 advanceTimeBy(2);222 return <AsyncText ms={1000} text="Loaded" fakeRenderDuration={1} />;223 };224 App = ({shouldSuspend, text = 'Text', textRenderDuration = 5}) => {225 ReactTestRenderer.unstable_yield('App');226 return (227 <Profiler id="root" onRender={onRender}>228 <Suspense maxDuration={500} fallback={<Fallback />}>229 {shouldSuspend && <Suspending />}230 <Text fakeRenderDuration={textRenderDuration} text={text} />231 </Suspense>232 </Profiler>233 );234 };235 });236 describe('when suspending during mount', () => {237 it('properly accounts for base durations when a suspended times out in a sync tree', () => {238 const root = ReactTestRenderer.create(<App shouldSuspend={true} />);239 expect(root.toJSON()).toEqual('Loading...');240 expect(onRender).toHaveBeenCalledTimes(1);241 // Initial mount only shows the "Loading..." Fallback.242 // The treeBaseDuration then should be 10ms spent rendering Fallback,243 // but the actualDuration should also include the 8ms spent rendering the hidden tree.244 expect(onRender.mock.calls[0][2]).toBe(18);245 expect(onRender.mock.calls[0][3]).toBe(10);246 jest.advanceTimersByTime(1000);247 expect(root.toJSON()).toEqual(['Loaded', 'Text']);248 expect(onRender).toHaveBeenCalledTimes(2);249 // When the suspending data is resolved and our final UI is rendered,250 // the baseDuration should only include the 1ms re-rendering AsyncText,251 // but the treeBaseDuration should include the full 8ms spent in the tree.252 expect(onRender.mock.calls[1][2]).toBe(1);253 expect(onRender.mock.calls[1][3]).toBe(8);254 });255 it('properly accounts for base durations when a suspended times out in a concurrent tree', () => {256 const root = ReactTestRenderer.create(<App shouldSuspend={true} />, {257 unstable_isConcurrent: true,258 });259 expect(root).toFlushAndYield([260 'App',261 'Suspending',262 'Suspend! [Loaded]',263 'Text',264 'Fallback',265 ]);266 expect(root).toMatchRenderedOutput(null);267 // Show the fallback UI.268 jest.advanceTimersByTime(750);269 expect(root).toMatchRenderedOutput('Loading...');270 expect(onRender).toHaveBeenCalledTimes(1);271 // Initial mount only shows the "Loading..." Fallback.272 // The treeBaseDuration then should be 10ms spent rendering Fallback,273 // but the actualDuration should also include the 8ms spent rendering the hidden tree.274 expect(onRender.mock.calls[0][2]).toBe(18);275 expect(onRender.mock.calls[0][3]).toBe(10);276 // Resolve the pending promise.277 jest.advanceTimersByTime(250);278 expect(ReactTestRenderer).toHaveYielded([279 'Promise resolved [Loaded]',280 ]);281 expect(root).toFlushAndYield(['Suspending', 'Loaded', 'Text']);282 expect(root).toMatchRenderedOutput('LoadedText');283 expect(onRender).toHaveBeenCalledTimes(2);284 // When the suspending data is resolved and our final UI is rendered,285 // both times should include the 8ms re-rendering Suspending and AsyncText.286 expect(onRender.mock.calls[1][2]).toBe(8);287 expect(onRender.mock.calls[1][3]).toBe(8);288 });289 });290 describe('when suspending during update', () => {291 it('properly accounts for base durations when a suspended times out in a sync tree', () => {292 const root = ReactTestRenderer.create(293 <App shouldSuspend={false} textRenderDuration={5} />,294 );295 expect(root.toJSON()).toEqual('Text');296 expect(onRender).toHaveBeenCalledTimes(1);297 // Initial mount only shows the "Text" text.298 // It should take 5ms to render.299 expect(onRender.mock.calls[0][2]).toBe(5);300 expect(onRender.mock.calls[0][3]).toBe(5);301 root.update(<App shouldSuspend={true} textRenderDuration={5} />);302 expect(root.toJSON()).toEqual('Loading...');303 expect(onRender).toHaveBeenCalledTimes(2);304 // The suspense update should only show the "Loading..." Fallback.305 // Both durations should include 10ms spent rendering Fallback306 // plus the 8ms rendering the (hidden) components.307 expect(onRender.mock.calls[1][2]).toBe(18);308 expect(onRender.mock.calls[1][3]).toBe(18);309 root.update(310 <App shouldSuspend={true} text="New" textRenderDuration={6} />,311 );312 expect(root.toJSON()).toEqual('Loading...');313 expect(onRender).toHaveBeenCalledTimes(3);314 // If we force another update while still timed out,315 // but this time the Text component took 1ms longer to render.316 // This should impact both actualDuration and treeBaseDuration.317 expect(onRender.mock.calls[2][2]).toBe(19);318 expect(onRender.mock.calls[2][3]).toBe(19);319 jest.advanceTimersByTime(1000);320 expect(root.toJSON()).toEqual(['Loaded', 'New']);321 expect(onRender).toHaveBeenCalledTimes(4);322 // When the suspending data is resolved and our final UI is rendered,323 // the baseDuration should only include the 1ms re-rendering AsyncText,324 // but the treeBaseDuration should include the full 9ms spent in the tree.325 expect(onRender.mock.calls[3][2]).toBe(1);326 expect(onRender.mock.calls[3][3]).toBe(9);327 });328 it('properly accounts for base durations when a suspended times out in a concurrent tree', () => {329 const root = ReactTestRenderer.create(330 <App shouldSuspend={false} textRenderDuration={5} />,331 {332 unstable_isConcurrent: true,333 },334 );335 expect(root).toFlushAndYield(['App', 'Text']);336 expect(root).toMatchRenderedOutput('Text');337 expect(onRender).toHaveBeenCalledTimes(1);338 // Initial mount only shows the "Text" text.339 // It should take 5ms to render.340 expect(onRender.mock.calls[0][2]).toBe(5);341 expect(onRender.mock.calls[0][3]).toBe(5);342 root.update(<App shouldSuspend={true} textRenderDuration={5} />);343 expect(root).toFlushAndYield([344 'App',345 'Suspending',346 'Suspend! [Loaded]',347 'Text',348 'Fallback',349 ]);350 expect(root).toMatchRenderedOutput('Text');351 // Show the fallback UI.352 jest.advanceTimersByTime(750);353 expect(root).toMatchRenderedOutput('Loading...');354 expect(onRender).toHaveBeenCalledTimes(2);355 // The suspense update should only show the "Loading..." Fallback.356 // The actual duration should include 10ms spent rendering Fallback,357 // plus the 8ms render all of the hidden, suspended subtree.358 // But the tree base duration should only include 10ms spent rendering Fallback,359 // plus the 5ms rendering the previously committed version of the hidden tree.360 expect(onRender.mock.calls[1][2]).toBe(18);361 expect(onRender.mock.calls[1][3]).toBe(15);362 // Update again while timed out.363 root.update(364 <App shouldSuspend={true} text="New" textRenderDuration={6} />,365 );366 expect(root).toFlushAndYield([367 'App',368 'Suspending',369 'Suspend! [Loaded]',370 'New',371 'Fallback',372 ]);373 expect(root).toMatchRenderedOutput('Loading...');374 expect(onRender).toHaveBeenCalledTimes(2);375 // Resolve the pending promise.376 jest.advanceTimersByTime(250);377 expect(ReactTestRenderer).toHaveYielded([378 'Promise resolved [Loaded]',379 ]);380 expect(root).toFlushAndYield(['App', 'Suspending', 'Loaded', 'New']);381 expect(onRender).toHaveBeenCalledTimes(3);382 // When the suspending data is resolved and our final UI is rendered,383 // both times should include the 6ms rendering Text,384 // the 2ms rendering Suspending, and the 1ms rendering AsyncText.385 expect(onRender.mock.calls[2][2]).toBe(9);386 expect(onRender.mock.calls[2][3]).toBe(9);387 });388 });389 });390 });...
ReactSuspenseFuzz-test.internal.js
1let React;2let Suspense;3let ReactTestRenderer;4let ReactFeatureFlags;5let Random;6const SEED = 0;7const prettyFormatPkg = require('pretty-format');8function prettyFormat(thing) {9 return prettyFormatPkg(thing, {10 plugins: [11 prettyFormatPkg.plugins.ReactElement,12 prettyFormatPkg.plugins.ReactTestComponent,13 ],14 });15}16describe('ReactSuspenseFuzz', () => {17 beforeEach(() => {18 jest.resetModules();19 ReactFeatureFlags = require('shared/ReactFeatureFlags');20 ReactFeatureFlags.debugRenderPhaseSideEffectsForStrictMode = false;21 ReactFeatureFlags.replayFailedUnitOfWorkWithInvokeGuardedCallback = false;22 React = require('react');23 Suspense = React.Suspense;24 ReactTestRenderer = require('react-test-renderer');25 Random = require('random-seed');26 });27 function createFuzzer() {28 const {useState, useContext, useLayoutEffect} = React;29 const ShouldSuspendContext = React.createContext(true);30 let pendingTasks = new Set();31 let cache = new Map();32 function resetCache() {33 pendingTasks = new Set();34 cache = new Map();35 }36 function Container({children, updates}) {37 const [step, setStep] = useState(0);38 useLayoutEffect(39 () => {40 if (updates !== undefined) {41 const cleanUps = new Set();42 updates.forEach(({remountAfter}, i) => {43 const task = {44 label: `Remount childen after ${remountAfter}ms`,45 };46 const timeoutID = setTimeout(() => {47 pendingTasks.delete(task);48 ReactTestRenderer.unstable_yield(task.label);49 setStep(i + 1);50 }, remountAfter);51 pendingTasks.add(task);52 cleanUps.add(() => {53 pendingTasks.delete(task);54 clearTimeout(timeoutID);55 });56 });57 return () => {58 cleanUps.forEach(cleanUp => cleanUp());59 };60 }61 },62 [updates],63 );64 return <React.Fragment key={step}>{children}</React.Fragment>;65 }66 function Text({text, initialDelay = 0, updates}) {67 const [[step, delay], setStep] = useState([0, initialDelay]);68 useLayoutEffect(69 () => {70 if (updates !== undefined) {71 const cleanUps = new Set();72 updates.forEach(({beginAfter, suspendFor}, i) => {73 const task = {74 label: `Update ${beginAfter}ms after mount and suspend for ${suspendFor}ms [${text}]`,75 };76 const timeoutID = setTimeout(() => {77 pendingTasks.delete(task);78 ReactTestRenderer.unstable_yield(task.label);79 setStep([i + 1, suspendFor]);80 }, beginAfter);81 pendingTasks.add(task);82 cleanUps.add(() => {83 pendingTasks.delete(task);84 clearTimeout(timeoutID);85 });86 });87 return () => {88 cleanUps.forEach(cleanUp => cleanUp());89 };90 }91 },92 [updates],93 );94 const fullText = `${text}:${step}`;95 const shouldSuspend = useContext(ShouldSuspendContext);96 let resolvedText;97 if (shouldSuspend && delay > 0) {98 resolvedText = cache.get(fullText);99 if (resolvedText === undefined) {100 const thenable = {101 then(resolve) {102 const task = {label: `Promise resolved [${fullText}]`};103 pendingTasks.add(task);104 setTimeout(() => {105 cache.set(fullText, fullText);106 pendingTasks.delete(task);107 ReactTestRenderer.unstable_yield(task.label);108 resolve();109 }, delay);110 },111 };112 cache.set(fullText, thenable);113 ReactTestRenderer.unstable_yield(`Suspended! [${fullText}]`);114 throw thenable;115 } else if (typeof resolvedText.then === 'function') {116 const thenable = resolvedText;117 ReactTestRenderer.unstable_yield(`Suspended! [${fullText}]`);118 throw thenable;119 }120 } else {121 resolvedText = fullText;122 }123 ReactTestRenderer.unstable_yield(resolvedText);124 return resolvedText;125 }126 function renderToRoot(127 root,128 children,129 {shouldSuspend} = {shouldSuspend: true},130 ) {131 root.update(132 <ShouldSuspendContext.Provider value={shouldSuspend}>133 {children}134 </ShouldSuspendContext.Provider>,135 );136 root.unstable_flushAll();137 let elapsedTime = 0;138 while (pendingTasks && pendingTasks.size > 0) {139 if ((elapsedTime += 1000) > 1000000) {140 throw new Error('Something did not resolve properly.');141 }142 ReactTestRenderer.act(() => jest.advanceTimersByTime(1000));143 root.unstable_flushAll();144 }145 return root.toJSON();146 }147 function testResolvedOutput(unwrappedChildren) {148 const children = (149 <Suspense fallback="Loading...">{unwrappedChildren}</Suspense>150 );151 const expectedRoot = ReactTestRenderer.create(null);152 const expectedOutput = renderToRoot(expectedRoot, children, {153 shouldSuspend: false,154 });155 expectedRoot.unmount();156 resetCache();157 const syncRoot = ReactTestRenderer.create(null);158 const syncOutput = renderToRoot(syncRoot, children);159 expect(syncOutput).toEqual(expectedOutput);160 syncRoot.unmount();161 resetCache();162 const concurrentRoot = ReactTestRenderer.create(null, {163 unstable_isConcurrent: true,164 });165 const concurrentOutput = renderToRoot(concurrentRoot, children);166 expect(concurrentOutput).toEqual(expectedOutput);167 concurrentRoot.unmount();168 concurrentRoot.unstable_flushAll();169 ReactTestRenderer.unstable_clearYields();170 }171 function pickRandomWeighted(rand, options) {172 let totalWeight = 0;173 for (let i = 0; i < options.length; i++) {174 totalWeight += options[i].weight;175 }176 let remainingWeight = rand.floatBetween(0, totalWeight);177 for (let i = 0; i < options.length; i++) {178 const {value, weight} = options[i];179 remainingWeight -= weight;180 if (remainingWeight <= 0) {181 return value;182 }183 }184 }185 function generateTestCase(rand, numberOfElements) {186 let remainingElements = numberOfElements;187 function createRandomChild(hasSibling) {188 const possibleActions = [189 {value: 'return', weight: 1},190 {value: 'text', weight: 1},191 ];192 if (hasSibling) {193 possibleActions.push({value: 'container', weight: 1});194 possibleActions.push({value: 'suspense', weight: 1});195 }196 const action = pickRandomWeighted(rand, possibleActions);197 switch (action) {198 case 'text': {199 remainingElements--;200 const numberOfUpdates = pickRandomWeighted(rand, [201 {value: 0, weight: 8},202 {value: 1, weight: 4},203 {value: 2, weight: 1},204 ]);205 let updates = [];206 for (let i = 0; i < numberOfUpdates; i++) {207 updates.push({208 beginAfter: rand.intBetween(0, 10000),209 suspendFor: rand.intBetween(0, 10000),210 });211 }212 return (213 <Text214 text={(remainingElements + 9).toString(36).toUpperCase()}215 initialDelay={rand.intBetween(0, 10000)}216 updates={updates}217 />218 );219 }220 case 'container': {221 const numberOfUpdates = pickRandomWeighted(rand, [222 {value: 0, weight: 8},223 {value: 1, weight: 4},224 {value: 2, weight: 1},225 ]);226 let updates = [];227 for (let i = 0; i < numberOfUpdates; i++) {228 updates.push({229 remountAfter: rand.intBetween(0, 10000),230 });231 }232 remainingElements--;233 const children = createRandomChildren(3);234 return React.createElement(Container, {updates}, ...children);235 }236 case 'suspense': {237 remainingElements--;238 const children = createRandomChildren(3);239 const maxDuration = pickRandomWeighted(rand, [240 {value: undefined, weight: 1},241 {value: rand.intBetween(0, 5000), weight: 1},242 ]);243 const fallbackType = pickRandomWeighted(rand, [244 {value: 'none', weight: 1},245 {value: 'normal', weight: 1},246 {value: 'nested suspense', weight: 1},247 ]);248 let fallback;249 if (fallbackType === 'normal') {250 fallback = 'Loading...';251 } else if (fallbackType === 'nested suspense') {252 fallback = React.createElement(253 React.Fragment,254 null,255 ...createRandomChildren(3),256 );257 }258 return React.createElement(259 Suspense,260 {maxDuration, fallback},261 ...children,262 );263 }264 case 'return':265 default:266 return null;267 }268 }269 function createRandomChildren(limit) {270 const children = [];271 while (remainingElements > 0 && children.length < limit) {272 children.push(createRandomChild(children.length > 0));273 }274 return children;275 }276 const children = createRandomChildren(Infinity);277 return React.createElement(React.Fragment, null, ...children);278 }279 return {Container, Text, testResolvedOutput, generateTestCase};280 }281 it('basic cases', () => {282 // This demonstrates that the testing primitives work283 const {Container, Text, testResolvedOutput} = createFuzzer();284 testResolvedOutput(285 <Container updates={[{remountAfter: 150}]}>286 <Text287 text="Hi"288 initialDelay={2000}289 updates={[{beginAfter: 100, suspendFor: 200}]}290 />291 </Container>,292 );293 });294 it('hard-coded cases', () => {295 const {Text, testResolvedOutput} = createFuzzer();296 testResolvedOutput(297 <React.Fragment>298 <Text299 initialDelay={20}300 text="A"301 updates={[{beginAfter: 10, suspendFor: 20}]}302 />303 <Suspense fallback="Loading... (B)">304 <Text305 initialDelay={10}306 text="B"307 updates={[{beginAfter: 30, suspendFor: 50}]}308 />309 <Text text="C" />310 </Suspense>311 </React.Fragment>,312 );313 });314 it('generative tests', () => {315 const {generateTestCase, testResolvedOutput} = createFuzzer();316 const rand = Random.create(SEED);317 const NUMBER_OF_TEST_CASES = 500;318 const ELEMENTS_PER_CASE = 12;319 for (let i = 0; i < NUMBER_OF_TEST_CASES; i++) {320 const randomTestCase = generateTestCase(rand, ELEMENTS_PER_CASE);321 try {322 testResolvedOutput(randomTestCase);323 } catch (e) {324 console.log(`325Failed fuzzy test case:326${prettyFormat(randomTestCase)}327`);328 throw e;329 }330 }331 });...
Using AI Code Generation
1const { shouldSuspend } = require('playwright/lib/utils/suspendable');2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch();5 const page = await browser.newPage();6 const frame = page.mainFrame();7 const element = await frame.waitForSelector('input[name="q"]');8 const result = await shouldSuspend(element, () => element.getAttribute('name'));9 await browser.close();10})();11module.exports = {12 use: {13 viewport: { width: 1280, height: 720 },14 },15 {16 use: {17 },18 },19 {20 use: {21 },22 },23 {24 use: {25 },26 },27};28const { test, expect } = require('@playwright/test');29test('basic test', async ({ page }) => {30 const title = page.locator('.navbar__inner .navbar__title');31 await expect(title).toHaveText('Playwright');32});
Using AI Code Generation
1const { shouldSuspend } = require('playwright/lib/server/supplements/recorder/recorderSupplement');2const { Page } = require('playwright/lib/server/page');3const { Frame } = require('playwright/lib/server/frame');4const { JSHandle } = require('playwright/lib/server/jsHandle');5const { ElementHandle } = require('playwright/lib/server/dom');6const { Worker } = require('playwright/lib/server/worker');7const { shouldSuspend } = require('playwright/lib/server/supplements/recorder/recorderSupplement');8const { Page } = require('playwright/lib/server/page');9const { Frame } = require('playwright/lib/server/frame');10const { JSHandle } = require('playwright/lib/server/jsHandle');11const { ElementHandle } = require('playwright/lib/server/dom');12const { Worker } = require('playwright/lib/server/worker');13const { shouldSuspend } = require('playwright/lib/server/supplements/recorder/recorderSupplement');14const { Page } = require('playwright/lib/server/page');15const { Frame } = require('playwright/lib/server/frame');16const { JSHandle } = require('playwright/lib/server/jsHandle');17const { ElementHandle } = require('playwright/lib/server/dom');18const { Worker } = require('playwright/lib/server/worker');19const { shouldSuspend } = require('playwright/lib/server/supplements/recorder/recorderSupplement');20const { Page } = require('playwright/lib/server/page');21const { Frame } = require('playwright/lib/server/frame');22const { JSHandle } = require('playwright/lib/server/jsHandle');23const { ElementHandle } = require('playwright/lib/server/dom');24const { Worker } = require('playwright/lib/server/worker');25const { shouldSuspend } = require('playwright/lib/server/supplements/recorder/recorderSupplement');26const { Page } = require('playwright/lib/server/page');27const { Frame } = require('playwright/lib/server/frame');28const { JSHandle } = require('playwright/lib/server/jsHandle');29const { ElementHandle } = require('playwright/lib/server/dom');30const { Worker } = require('playwright/lib/server/worker');31const { shouldSuspend } = require('
Using AI Code Generation
1const { Playwright } = require('playwright');2const playwright = Playwright.create();3const browser = await playwright.chromium.launch();4const context = await browser.newContext();5const page = await context.newPage();6const shouldSuspend = page._delegate.shouldSuspend.bind(page._delegate);7const result = await shouldSuspend();8console.log(result);9await browser.close();
Using AI Code Generation
1const { shouldSuspend } = require('playwright/lib/internal/supplements/utils/suspender');2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch({ headless: false });5 const context = await browser.newContext();6 const page = await context.newPage();7 await browser.close();8})();
Using AI Code Generation
1const { shouldSuspend } = require('playwright/lib/internal/supplements/recorder/supplements/recorderSupplement.js');2const { Page } = require('playwright/lib/server/page.js');3const { Frame } = require('playwright/lib/server/frame.js');4const { Page } = require('playwright/lib/server/page.js');5const { Frame } = require('playwright/lib/server/frame.js');6const { Page } = require('playwright/lib/server/page.js');7const { Frame } = require('playwright/lib/server/frame.js');8const { Page } = require('playwright/lib/server/page.js');9const { Frame } = require('playwright/lib/server/frame.js');10const { Page } = require('playwright/lib/server/page.js');11const { Frame } = require('playwright/lib/server/frame.js');12const { Page } = require('playwright/lib/server/page.js');13const { Frame } = require('playwright/lib/server/frame.js');14const { Page } = require('playwright/lib/server/page.js');15const { Frame } = require('playwright/lib/server/frame.js');16const { Page } = require('playwright/lib/server/page.js');17const { Frame } = require('playwright/lib/server/frame.js');18const { Page } = require('playwright/lib/server/page.js');19const { Frame } = require('playwright/lib/server/frame.js');20const { Page } = require('playwright/lib/server/page.js');21const { Frame } = require('playwright/lib/server/frame.js');22const { Page } = require('playwright/lib/server/page.js');23const { Frame } = require('playwright/lib/server/frame.js');24const { Page } = require('playwright/lib/server/page.js');25const { Frame } = require('playwright/lib/server/frame.js');26const { Page } = require('playwright/lib/server/page.js');27const { Frame } = require('playwright/lib/server/frame
Using AI Code Generation
1const { shouldSuspend } = require('playwright/lib/server/supplements/recorder/recorderSupplement.js');2const { Page } = require('playwright');3const page = new Page();4const frame = page.mainFrame();5const shouldSuspendResult = shouldSuspend(frame, 'click', {selector: '.foo'});6console.log(shouldSuspendResult);
Using AI Code Generation
1const { shouldSuspend } = require('playwright/lib/server/chromium/crNetworkManager');2const request = {3 headers: {4 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'5 }6};7const result = shouldSuspend(request);8console.log(result);
Using AI Code Generation
1const { shouldSuspend } = require('playwright/lib/internal');2const { isUnderTest } = require('playwright/lib/utils/utils');3const { isUnderTest } = require('playwright/lib/utils/utils');4const { isUnderTest } = require('playwright/lib/utils/utils');5isUnderTest() && shouldSuspend();6const { shouldSuspend } = require('playwright/lib/internal');7const { isUnderTest } = require('playwright/lib/utils/utils');8const { isUnderTest } = require('playwright/lib/utils/utils');9const { isUnderTest } = require('playwright/lib/utils/utils');10isUnderTest() && shouldSuspend();11const { shouldSuspend } = require('playwright/lib/internal');12const { isUnderTest } = require('playwright/lib/utils/utils');13const { isUnderTest } = require('playwright/lib/utils/utils');14const { isUnderTest } = require('playwright/lib/utils/utils');15isUnderTest() && shouldSuspend();16const { shouldSuspend } = require('playwright/lib/internal');17const { isUnderTest } = require('playwright/lib/utils/utils');18const { isUnderTest } = require('playwright/lib/utils/utils');19const { isUnderTest } = require('playwright/lib/utils/utils');20isUnderTest() && shouldSuspend();21const { shouldSuspend } = require('playwright/lib/internal');22const { isUnderTest } = require('playwright/lib/utils/utils');23const { isUnderTest } = require('playwright/lib/utils/utils');24const { isUnderTest } = require('playwright/lib/utils/utils');25isUnderTest() && shouldSuspend();26const { shouldSuspend } = require('playwright/lib/internal');27const { isUnderTest } = require('playwright/lib/utils/utils');28const { isUnderTest } = require('playwright/lib/utils/utils');29const { isUnderTest } = require('playwright/lib/utils/utils');30isUnderTest() && shouldSuspend();31const { shouldSuspend } = require('playwright/lib/internal');32const { isUnderTest } = require('playwright/lib/utils/utils');
Using AI Code Generation
1const { shouldSuspend } = require('playwright-core/lib/server/supplements/recorder/recorderSupplement.js');2const { test } = require('@playwright/test');3test('my test', async ({ page }) => {4 await page.click('text=Get started');5 await shouldSuspend(page);6});7{8 "scripts": {9 },10 "devDependencies": {11 }12}
Jest + Playwright - Test callbacks of event-based DOM library
firefox browser does not start in playwright
Is it possible to get the selector from a locator object in playwright?
How to run a list of test suites in a single file concurrently in jest?
Running Playwright in Azure Function
firefox browser does not start in playwright
This question is quite close to a "need more focus" question. But let's try to give it some focus:
Does Playwright has access to the cPicker object on the page? Does it has access to the window object?
Yes, you can access both cPicker and the window object inside an evaluate call.
Should I trigger the events from the HTML file itself, and in the callbacks, print in the DOM the result, in some dummy-element, and then infer from that dummy element text that the callbacks fired?
Exactly, or you can assign values to a javascript variable:
const cPicker = new ColorPicker({
onClickOutside(e){
},
onInput(color){
window['color'] = color;
},
onChange(color){
window['result'] = color;
}
})
And then
it('Should call all callbacks with correct arguments', async() => {
await page.goto(`http://localhost:5000/tests/visual/basic.html`, {waitUntil:'load'})
// Wait until the next frame
await page.evaluate(() => new Promise(requestAnimationFrame))
// Act
// Assert
const result = await page.evaluate(() => window['color']);
// Check the value
})
Check out the latest blogs from LambdaTest on this topic:
Native apps are developed specifically for one platform. Hence they are fast and deliver superior performance. They can be downloaded from various app stores and are not accessible through browsers.
One of the essential parts when performing automated UI testing, whether using Selenium or another framework, is identifying the correct web elements the tests will interact with. However, if the web elements are not located correctly, you might get NoSuchElementException in Selenium. This would cause a false negative result because we won’t get to the actual functionality check. Instead, our test will fail simply because it failed to interact with the correct element.
Smartphones have changed the way humans interact with technology. Be it travel, fitness, lifestyle, video games, or even services, it’s all just a few touches away (quite literally so). We only need to look at the growing throngs of smartphone or tablet users vs. desktop users to grasp this reality.
As part of one of my consulting efforts, I worked with a mid-sized company that was looking to move toward a more agile manner of developing software. As with any shift in work style, there is some bewilderment and, for some, considerable anxiety. People are being challenged to leave their comfort zones and embrace a continuously changing, dynamic working environment. And, dare I say it, testing may be the most ‘disturbed’ of the software roles in agile development.
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!