fix(trial): restore mouse position
This commit is contained in:
parent
eed8179db2
commit
c91d3e76a0
|
|
@ -457,11 +457,16 @@ export class ElementHandle<T extends Node = Node> extends js.JSHandle<T> {
|
||||||
if ((options as any).__testHookBeforePointerAction)
|
if ((options as any).__testHookBeforePointerAction)
|
||||||
await (options as any).__testHookBeforePointerAction();
|
await (options as any).__testHookBeforePointerAction();
|
||||||
progress.throwIfAborted(); // Avoid action that has side-effects.
|
progress.throwIfAborted(); // Avoid action that has side-effects.
|
||||||
|
let restoreMousePosition: types.Point | undefined;
|
||||||
|
if (options.trial)
|
||||||
|
restoreMousePosition = await this._page.mouse.position();
|
||||||
let restoreModifiers: types.KeyboardModifier[] | undefined;
|
let restoreModifiers: types.KeyboardModifier[] | undefined;
|
||||||
if (options && options.modifiers)
|
if (options && options.modifiers)
|
||||||
restoreModifiers = await this._page.keyboard.ensureModifiers(options.modifiers);
|
restoreModifiers = await this._page.keyboard.ensureModifiers(options.modifiers);
|
||||||
progress.log(` performing ${actionName} action`);
|
progress.log(` performing ${actionName} action`);
|
||||||
await action(point);
|
await action(point);
|
||||||
|
if (restoreMousePosition)
|
||||||
|
await this._page.mouse.move(restoreMousePosition.x, restoreMousePosition.y);
|
||||||
if (restoreModifiers)
|
if (restoreModifiers)
|
||||||
await this._page.keyboard.ensureModifiers(restoreModifiers);
|
await this._page.keyboard.ensureModifiers(restoreModifiers);
|
||||||
if (hitTargetInterceptionHandle) {
|
if (hitTargetInterceptionHandle) {
|
||||||
|
|
|
||||||
|
|
@ -180,6 +180,10 @@ export class Mouse {
|
||||||
this._keyboard = this._page.keyboard;
|
this._keyboard = this._page.keyboard;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async position(): Promise<types.Point> {
|
||||||
|
return { x: this._x, y: this._y };
|
||||||
|
}
|
||||||
|
|
||||||
async move(x: number, y: number, options: { steps?: number, forClick?: boolean } = {}, metadata?: CallMetadata) {
|
async move(x: number, y: number, options: { steps?: number, forClick?: boolean } = {}, metadata?: CallMetadata) {
|
||||||
if (metadata)
|
if (metadata)
|
||||||
metadata.point = { x, y };
|
metadata.point = { x, y };
|
||||||
|
|
|
||||||
|
|
@ -305,3 +305,44 @@ it('should dispatch mouse move after context menu was opened', async ({ page, br
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should support click trial', async ({ page }) => {
|
||||||
|
await page.setContent(`<button onclick="this.innerText = 'updated'">initial</button>`);
|
||||||
|
const locator = page.locator('button');
|
||||||
|
|
||||||
|
await locator.click({ trial: true });
|
||||||
|
await expect(locator).toHaveText('initial');
|
||||||
|
|
||||||
|
await locator.click();
|
||||||
|
await expect(locator).toHaveText('updated');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should support click trial with modifiers', async ({ page }) => {
|
||||||
|
await page.setContent(`<button onclick="this.innerText = 'clicked'">initial</button>`);
|
||||||
|
const locator = page.locator('button');
|
||||||
|
|
||||||
|
await page.evaluate(() => {
|
||||||
|
document.body.addEventListener('keydown', (event: KeyboardEvent) => {
|
||||||
|
document.querySelector('button').innerText = 'keydown:' + event.key;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
await locator.click({ trial: true, modifiers: ['Shift'] });
|
||||||
|
await expect(locator).toHaveText('keydown:Shift');
|
||||||
|
|
||||||
|
await locator.click({ modifiers: ['Shift'] });
|
||||||
|
await expect(locator).toHaveText('clicked');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should support hover trial', async ({ page }) => {
|
||||||
|
await page.setContent(`<button onmouseover="this.innerText = 'mouseover'">initial</button>`);
|
||||||
|
const locator = page.locator('button');
|
||||||
|
|
||||||
|
await locator.hover({ trial: true });
|
||||||
|
await expect(locator).toHaveText('initial');
|
||||||
|
|
||||||
|
// Note: hover right after trial only works because trial restores the mouse
|
||||||
|
// position. Otherwise, the mouse would not move and hence no mousemove or
|
||||||
|
// mouseover event would be triggered.
|
||||||
|
await locator.hover();
|
||||||
|
await expect(locator).toHaveText('mouseover');
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue