Skip to content

Commit 9c67ce5

Browse files
authored
test: simplify pausing tests (#2056)
1 parent 671e465 commit 9c67ce5

File tree

2 files changed

+16
-49
lines changed

2 files changed

+16
-49
lines changed

src/dom.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -239,20 +239,14 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
239239

240240
async _performPointerAction(action: (point: types.Point) => Promise<void>, deadline: number, options: PointerActionOptions & types.PointerActionWaitOptions & types.NavigatingActionWaitOptions = {}): Promise<'done' | 'retry'> {
241241
const { force = false, position } = options;
242-
const skipStableCheck = (options as any).__testHookSkipStablePosition;
243-
if (!force && !skipStableCheck)
242+
if (!force)
244243
await this._waitForDisplayedAtStablePosition(deadline);
245244

246245
let paused = false;
247246
try {
248247
await this._page._delegate.setActivityPaused(true);
249248
paused = true;
250249

251-
if (typeof skipStableCheck === 'function')
252-
await skipStableCheck();
253-
else if (skipStableCheck)
254-
await skipStableCheck;
255-
256250
// Scroll into view and calculate the point again while paused just in case something has moved.
257251
this._page._log(inputLog, 'scrolling into view if needed...');
258252
await this._scrollRectIntoViewIfNeeded(position ? { x: position.x, y: position.y, width: 0, height: 0 } : undefined);

test/click.spec.js

Lines changed: 15 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -570,47 +570,19 @@ describe('Page.click', function() {
570570
expect(clicked).toBe(true);
571571
expect(await page.evaluate(() => window.clicked)).toBe(true);
572572
});
573-
it('should retry when element jumps during hit testing', async({page, server}) => {
574-
await page.goto(server.PREFIX + '/input/animating-button.html');
575-
await page.evaluate(() => addButton());
576-
let clicked = false;
577-
const handle = await page.$('button');
578-
const __testHookBeforeHitTarget = () => page.evaluate(() => { if (window.x === 0) jump(); });
579-
const promise = handle.click({ timeout: 0, __testHookBeforeHitTarget }).then(() => clicked = true);
580-
expect(clicked).toBe(false);
581-
expect(await page.evaluate(() => window.clicked)).toBe(undefined);
582-
await page.evaluate(() => stopButton());
583-
await promise;
584-
expect(clicked).toBe(true);
585-
expect(await page.evaluate(() => window.clicked)).toBe(true);
586-
});
587573
it('should fail when element jumps during hit testing', async({page, server}) => {
588-
await page.goto(server.PREFIX + '/input/animating-button.html');
589-
await page.evaluate(() => addButton());
590-
await page.evaluate(() => stopButton());
574+
await page.setContent('<button>Click me</button>');
591575
let clicked = false;
592576
const handle = await page.$('button');
593-
const __testHookBeforeHitTarget = () => page.evaluate(() => jump());
594-
const promise = handle.click({ timeout: 1000, __testHookBeforeHitTarget, __testHookSkipStablePosition: true }).then(() => clicked = true).catch(e => e);
577+
const __testHookBeforeHitTarget = () => page.evaluate(() => {
578+
const margin = parseInt(document.querySelector('button').style.marginLeft || 0) + 100;
579+
document.querySelector('button').style.marginLeft = margin + 'px';
580+
});
581+
const promise = handle.click({ timeout: 1000, __testHookBeforeHitTarget }).then(() => clicked = true).catch(e => e);
595582
const error = await promise;
596583
expect(clicked).toBe(false);
597584
expect(await page.evaluate(() => window.clicked)).toBe(undefined);
598-
expect(error.message).toBe('waiting for element to receive pointer events failed: timeout exceeded');
599-
});
600-
it.fail(CHROMIUM || FFOX)('should work when element jumps uncontrollably', async({page, server}) => {
601-
// This test requires pausing the page.
602-
await page.goto(server.PREFIX + '/input/animating-button.html');
603-
await page.evaluate(() => addButton());
604-
await page.evaluate(() => stopButton());
605-
const handle = await page.$('button');
606-
await page.evaluate(() => startJumping());
607-
let clicked = false;
608-
const promise = handle.click({ timeout: 1000, __testHookSkipStablePosition: true }).then(() => clicked = true);
609-
expect(clicked).toBe(false);
610-
expect(await page.evaluate(() => window.clicked)).toBe(undefined);
611-
await promise;
612-
expect(clicked).toBe(true);
613-
expect(await page.evaluate(() => window.clicked)).toBe(true);
585+
expect(error.message).toContain('timeout exceeded');
614586
});
615587
it.fail(CHROMIUM || FFOX)('should pause animations', async({page}) => {
616588
// This test requires pausing the page.
@@ -621,6 +593,7 @@ describe('Page.click', function() {
621593
}
622594
.spinner {
623595
animation: spinner 2s linear infinite;
596+
animation-delay: 500ms;
624597
}
625598
</style>
626599
<div class="spinner" style="width: 500px; height: 500px; display: flex; justify-content: center;" >
@@ -629,40 +602,40 @@ describe('Page.click', function() {
629602
onclick="window.clicked=true"></button>
630603
</div>
631604
`);
632-
await page.click('#target', { __testHookSkipStablePosition: new Promise(f => setTimeout(f, 100)) });
605+
await page.click('#target', { __testHookBeforeHitTarget: () => new Promise(f => setTimeout(f, 1000)) });
633606
expect(await page.evaluate(() => window.clicked)).toBe(true);
634607
});
635608
it.fail(CHROMIUM || FFOX)('should defer timers', async({page}) => {
636609
// This test requires pausing the page.
637610
await page.setContent(`<button id=button onclick="window.clicked=true">Click me</button>`);
638-
await page.click('button', { __testHookSkipStablePosition: async () => {
611+
await page.click('button', { __testHookBeforeHitTarget: async () => {
639612
// Schedule a timer that hides the element
640613
await page.evaluate(() => setTimeout(() => button.style.display = 'none', 0));
641614
// Allow enough time for timer to fire
642-
await page.waitForTimeout(100);
615+
await page.waitForTimeout(500);
643616
}});
644617
expect(await page.evaluate(() => window.clicked)).toBe(true);
645618
});
646619
it.fail(CHROMIUM || FFOX)('should defer rafs', async({page}) => {
647620
// This test requires pausing the page.
648621
await page.setContent(`<button id=button onclick="window.clicked=true">Click me</button>`);
649-
await page.click('button', { __testHookSkipStablePosition: async () => {
622+
await page.click('button', { __testHookBeforeHitTarget: async () => {
650623
// Schedule a timer that hides the element
651624
await page.evaluate(() => requestAnimationFrame(() => button.style.display = 'none'));
652625
// Allow enough time for raf to fire
653-
await page.waitForTimeout(100);
626+
await page.waitForTimeout(500);
654627
}});
655628
expect(await page.evaluate(() => window.clicked)).toBe(true);
656629
});
657630
it.fail(CHROMIUM || FFOX)('should defer fetch', async({page, server}) => {
658631
// This test requires pausing the page.
659632
await page.goto(server.EMPTY_PAGE);
660633
await page.setContent(`<button id=button onclick="window.clicked=true">Click me</button>`);
661-
await page.click('button', { __testHookSkipStablePosition: async () => {
634+
await page.click('button', { __testHookBeforeHitTarget: async () => {
662635
// Fetch that would immediately delete button.
663636
page.evaluate(() => fetch(window.location.href).then(() => button.style.display = 'none'));
664637
// Allow enough time for raf to fire
665-
await page.waitForTimeout(100);
638+
await page.waitForTimeout(500);
666639
}});
667640
expect(await page.evaluate(() => window.clicked)).toBe(true);
668641
});

0 commit comments

Comments
 (0)