Get puppeteer to produce a touch event - this also uncovered an error where a subsequent click would be picked up as a touch (see thisEventKey change)

This commit is contained in:
Eoghan Murray
2026-04-01 12:00:00 +08:00
parent 488949a5e3
commit 3c425397fb
3 changed files with 43 additions and 3 deletions

View File

@@ -238,6 +238,7 @@ function initMouseInteractionObserver({
return; return;
} }
let pointerType: PointerTypes | null = null; let pointerType: PointerTypes | null = null;
let thisEventKey = eventKey;
if ('pointerType' in event) { if ('pointerType' in event) {
Object.keys(PointerTypes).forEach( Object.keys(PointerTypes).forEach(
(pointerKey: keyof typeof PointerTypes) => { (pointerKey: keyof typeof PointerTypes) => {
@@ -252,12 +253,12 @@ function initMouseInteractionObserver({
if (pointerType === PointerTypes.Touch) { if (pointerType === PointerTypes.Touch) {
if (MouseInteractions[eventKey] === MouseInteractions.MouseDown) { if (MouseInteractions[eventKey] === MouseInteractions.MouseDown) {
// we are actually listening on 'pointerdown' // we are actually listening on 'pointerdown'
eventKey = 'TouchStart'; thisEventKey = 'TouchStart';
} else if ( } else if (
MouseInteractions[eventKey] === MouseInteractions.MouseUp MouseInteractions[eventKey] === MouseInteractions.MouseUp
) { ) {
// we are actually listening on 'pointerup' // we are actually listening on 'pointerup'
eventKey = 'TouchEnd'; thisEventKey = 'TouchEnd';
} }
} else if (pointerType == PointerTypes.Pen) { } else if (pointerType == PointerTypes.Pen) {
// TODO: these will get incorrectly emitted as MouseDown/MouseUp // TODO: these will get incorrectly emitted as MouseDown/MouseUp
@@ -278,7 +279,7 @@ function initMouseInteractionObserver({
const id = mirror.getId(target); const id = mirror.getId(target);
const { clientX, clientY } = e; const { clientX, clientY } = e;
callbackWrapper(mouseInteractionCb)({ callbackWrapper(mouseInteractionCb)({
type: MouseInteractions[eventKey], type: MouseInteractions[thisEventKey],
id, id,
x: clientX, x: clientX,
y: clientY, y: clientY,

View File

@@ -1551,6 +1551,33 @@ exports[`record integration tests can record clicks 1`] = `
\\"pointerType\\": 0 \\"pointerType\\": 0
} }
}, },
{
\\"type\\": 3,
\\"data\\": {
\\"source\\": 2,
\\"type\\": 7,
\\"id\\": 18,
\\"pointerType\\": 2
}
},
{
\\"type\\": 3,
\\"data\\": {
\\"source\\": 2,
\\"type\\": 9,
\\"id\\": 18,
\\"pointerType\\": 2
}
},
{
\\"type\\": 3,
\\"data\\": {
\\"source\\": 2,
\\"type\\": 2,
\\"id\\": 18,
\\"pointerType\\": 2
}
},
{ {
\\"type\\": 3, \\"type\\": 3,
\\"data\\": { \\"data\\": {

View File

@@ -67,6 +67,18 @@ describe('record integration tests', function (this: ISuite) {
await page.goto('about:blank'); await page.goto('about:blank');
await page.setContent(getHtml.call(this, 'link.html')); await page.setContent(getHtml.call(this, 'link.html'));
await page.click('span'); await page.click('span');
// also tap on the span
const span = await page.waitForSelector('span');
const center = await page.evaluate((el) => {
const { x, y, width, height } = el.getBoundingClientRect();
return {
x: Math.round(x + width / 2),
y: Math.round(y + height / 2),
};
}, span);
await page.touchscreen.tap(center.x, center.y);
await page.click('a'); await page.click('a');
const snapshots = await page.evaluate('window.snapshots'); const snapshots = await page.evaluate('window.snapshots');