feat(firefox): implement Page.touchscreen (#4070)
This commit is contained in:
parent
3541b894f5
commit
f21486fa1b
@ -319,6 +319,16 @@ class DOMWorld {
|
|||||||
}, values);
|
}, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} selector
|
||||||
|
*/
|
||||||
|
async tap(selector) {
|
||||||
|
const handle = await this.$(selector);
|
||||||
|
assert(handle, 'No node found for selector: ' + selector);
|
||||||
|
await handle.tap();
|
||||||
|
await handle.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} selector
|
* @param {string} selector
|
||||||
* @param {string} text
|
* @param {string} text
|
||||||
|
@ -253,6 +253,13 @@ class Frame {
|
|||||||
return this._mainWorld.click(selector, options);
|
return this._mainWorld.click(selector, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} selector
|
||||||
|
*/
|
||||||
|
async tap(selector) {
|
||||||
|
return this._mainWorld.tap(selector);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} selector
|
* @param {string} selector
|
||||||
* @param {string} text
|
* @param {string} text
|
||||||
|
@ -292,4 +292,43 @@ class Mouse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { Keyboard, Mouse };
|
class Touchscreen {
|
||||||
|
/**
|
||||||
|
* @param {Puppeteer.JugglerSession} client
|
||||||
|
* @param {Keyboard} keyboard
|
||||||
|
* @param {Mouse} mouse
|
||||||
|
*/
|
||||||
|
constructor(client, keyboard, mouse) {
|
||||||
|
this._client = client;
|
||||||
|
this._keyboard = keyboard;
|
||||||
|
this._mouse = mouse;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {number} x
|
||||||
|
* @param {number} y
|
||||||
|
*/
|
||||||
|
async tap(x, y) {
|
||||||
|
const touchPoints = [{x: Math.round(x), y: Math.round(y)}];
|
||||||
|
let {defaultPrevented} = (await this._client.send('Page.dispatchTouchEvent', {
|
||||||
|
type: 'touchStart',
|
||||||
|
touchPoints,
|
||||||
|
modifiers: this._keyboard._modifiers
|
||||||
|
}));
|
||||||
|
defaultPrevented = (await this._client.send('Page.dispatchTouchEvent', {
|
||||||
|
type: 'touchEnd',
|
||||||
|
touchPoints,
|
||||||
|
modifiers: this._keyboard._modifiers
|
||||||
|
})).defaultPrevented || defaultPrevented;
|
||||||
|
// Do not dispatch related mouse events if either of touch events
|
||||||
|
// were prevented.
|
||||||
|
// See https://developer.mozilla.org/en-US/docs/Web/API/Touch_events/Supporting_both_TouchEvent_and_MouseEvent#Event_order
|
||||||
|
if (defaultPrevented)
|
||||||
|
return;
|
||||||
|
await this._mouse.move(x, y);
|
||||||
|
await this._mouse.down();
|
||||||
|
await this._mouse.up();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { Keyboard, Mouse, Touchscreen };
|
||||||
|
@ -332,6 +332,12 @@ class ElementHandle extends JSHandle {
|
|||||||
await this._frame._page.mouse.click(x, y, options);
|
await this._frame._page.mouse.click(x, y, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async tap() {
|
||||||
|
await this._scrollIntoViewIfNeeded();
|
||||||
|
const {x, y} = await this._clickablePoint();
|
||||||
|
await this._frame._page.touchscreen.tap(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {!Array<string>} filePaths
|
* @param {!Array<string>} filePaths
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
const {helper, debugError, assert} = require('./helper');
|
const {helper, debugError, assert} = require('./helper');
|
||||||
const {Keyboard, Mouse} = require('./Input');
|
const {Keyboard, Mouse, Touchscreen} = require('./Input');
|
||||||
const {Dialog} = require('./Dialog');
|
const {Dialog} = require('./Dialog');
|
||||||
const {TimeoutError} = require('./Errors');
|
const {TimeoutError} = require('./Errors');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
@ -46,6 +46,7 @@ class Page extends EventEmitter {
|
|||||||
this._target = target;
|
this._target = target;
|
||||||
this._keyboard = new Keyboard(session);
|
this._keyboard = new Keyboard(session);
|
||||||
this._mouse = new Mouse(session, this._keyboard);
|
this._mouse = new Mouse(session, this._keyboard);
|
||||||
|
this._touchscreen = new Touchscreen(session, this._keyboard, this._mouse);
|
||||||
this._closed = false;
|
this._closed = false;
|
||||||
/** @type {!Map<string, Function>} */
|
/** @type {!Map<string, Function>} */
|
||||||
this._pageBindings = new Map();
|
this._pageBindings = new Map();
|
||||||
@ -337,6 +338,10 @@ class Page extends EventEmitter {
|
|||||||
return this._mouse;
|
return this._mouse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get touchscreen(){
|
||||||
|
return this._touchscreen;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {!{timeout?: number, waitUntil?: string|!Array<string>}} options
|
* @param {!{timeout?: number, waitUntil?: string|!Array<string>}} options
|
||||||
*/
|
*/
|
||||||
@ -505,6 +510,13 @@ class Page extends EventEmitter {
|
|||||||
return await this._frameManager.mainFrame().click(selector, options);
|
return await this._frameManager.mainFrame().click(selector, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} selector
|
||||||
|
*/
|
||||||
|
tap(selector) {
|
||||||
|
return this.mainFrame().tap(selector);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} selector
|
* @param {string} selector
|
||||||
* @param {string} text
|
* @param {string} text
|
||||||
|
@ -16,5 +16,6 @@ module.exports = {
|
|||||||
Response: require('./NetworkManager').Response,
|
Response: require('./NetworkManager').Response,
|
||||||
SecurityDetails: require('./NetworkManager').SecurityDetails,
|
SecurityDetails: require('./NetworkManager').SecurityDetails,
|
||||||
Target: require('./Browser').Target,
|
Target: require('./Browser').Target,
|
||||||
|
Touchscreen: require('./Input').Touchscreen,
|
||||||
TimeoutError: require('./Errors').TimeoutError,
|
TimeoutError: require('./Errors').TimeoutError,
|
||||||
};
|
};
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
"node": ">=8.9.4"
|
"node": ">=8.9.4"
|
||||||
},
|
},
|
||||||
"puppeteer": {
|
"puppeteer": {
|
||||||
"firefox_revision": "764023af0aa07d232984dec6bc81d9e904f25ddb"
|
"firefox_revision": "6237be74b2870ab50cc165b9d5be46a85091674f"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"install": "node install.js",
|
"install": "node install.js",
|
||||||
|
@ -14,17 +14,20 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
module.exports.addTests = function({testRunner, expect}) {
|
module.exports.addTests = function({testRunner, expect, DeviceDescriptors}) {
|
||||||
const {describe, xdescribe, fdescribe} = testRunner;
|
const {describe, xdescribe, fdescribe} = testRunner;
|
||||||
const {it, fit, xit, it_fails_ffox} = testRunner;
|
const {it, fit, xit, it_fails_ffox} = testRunner;
|
||||||
|
const iPhone = DeviceDescriptors['iPhone 6'];
|
||||||
const {beforeAll, beforeEach, afterAll, afterEach} = testRunner;
|
const {beforeAll, beforeEach, afterAll, afterEach} = testRunner;
|
||||||
describe('Touchscreen', function() {
|
describe('Touchscreen', function() {
|
||||||
it_fails_ffox('should tap the button', async({page, server}) => {
|
it('should tap the button', async({page, server}) => {
|
||||||
|
await page.emulate(iPhone);
|
||||||
await page.goto(server.PREFIX + '/input/button.html');
|
await page.goto(server.PREFIX + '/input/button.html');
|
||||||
await page.tap('button');
|
await page.tap('button');
|
||||||
expect(await page.evaluate(() => result)).toBe('Clicked');
|
expect(await page.evaluate(() => result)).toBe('Clicked');
|
||||||
});
|
});
|
||||||
xit('should report touches', async({page, server}) => {
|
it('should report touches', async({page, server}) => {
|
||||||
|
await page.emulate(iPhone);
|
||||||
await page.goto(server.PREFIX + '/input/touches.html');
|
await page.goto(server.PREFIX + '/input/touches.html');
|
||||||
const button = await page.$('button');
|
const button = await page.$('button');
|
||||||
await button.tap();
|
await button.tap();
|
||||||
|
Loading…
Reference in New Issue
Block a user