From 45f264024b16ee0a23e8d5d9a974720108180997 Mon Sep 17 00:00:00 2001 From: Alix Axel Date: Mon, 25 Sep 2017 11:23:34 +0200 Subject: [PATCH] [api] Introduce Page.select method (#779) This patch adds `Page.select` method to select values in a `select` tag. --- docs/api.md | 14 +++++++++ lib/Page.js | 23 +++++++++++++++ test/assets/input/select.html | 55 +++++++++++++++++++++++++++++++++++ test/test.js | 44 ++++++++++++++++++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 test/assets/input/select.html diff --git a/docs/api.md b/docs/api.md index 5345433f48d74..18a6c3c04610b 100644 --- a/docs/api.md +++ b/docs/api.md @@ -60,6 +60,7 @@ + [page.press(key[, options])](#pagepresskey-options) + [page.reload(options)](#pagereloadoptions) + [page.screenshot([options])](#pagescreenshotoptions) + + [page.select(selector, ...values)](#pageselectselector-values) + [page.setContent(html)](#pagesetcontenthtml) + [page.setCookie(...cookies)](#pagesetcookiecookies) + [page.setExtraHTTPHeaders(headers)](#pagesetextrahttpheadersheaders) @@ -725,6 +726,19 @@ Shortcut for [`keyboard.down`](#keyboarddownkey-options) and [`keyboard.up`](#ke - `omitBackground` <[boolean]> Hides default white background and allows capturing screenshots with transparency. Defaults to `false`. - returns: <[Promise]<[Buffer]>> Promise which resolves to buffer with captured screenshot +#### page.select(selector, ...values) +- `selector` <[string]> A [selector] to query page for +- `...values` <...[string]> Values of options to select. If the `` element matching `selector`, the method throws an error. + +```js +page.select('select#colors', 'blue'); // single selection +page.select('select#colors', 'red', 'green', 'blue'); // multiple selections +``` + #### page.setContent(html) - `html` <[string]> HTML markup to assign to the page. - returns: <[Promise]> diff --git a/lib/Page.js b/lib/Page.js index 58c0f2ffc4d36..7fa7ce5340355 100644 --- a/lib/Page.js +++ b/lib/Page.js @@ -693,6 +693,29 @@ class Page extends EventEmitter { await handle.dispose(); } + /** + * @param {string} selector + * @param {!Array} values + */ + async select(selector, ...values) { + await this.$eval(selector, (element, values) => { + if (element.nodeName.toLowerCase() !== 'select') + throw new Error('Element is not a + + + + + + + + + + + + + + + + + + + diff --git a/test/test.js b/test/test.js index b73f84c5ef5ed..3b9883596cec7 100644 --- a/test/test.js +++ b/test/test.js @@ -1177,6 +1177,7 @@ describe('Page', function() { expect(element).toBe(null); })); }); + describe('Page.$$', function() { it('should query existing elements', SX(async function() { await page.setContent('
A

B
'); @@ -1530,6 +1531,7 @@ describe('Page', function() { expect(await page.evaluate(() => navigator.userAgent)).toContain('Safari'); })); }); + describe('Page.setExtraHTTPHeaders', function() { it('should work', SX(async function() { await page.setExtraHTTPHeaders({ @@ -1551,6 +1553,7 @@ describe('Page', function() { expect(error.message).toBe('Expected value of header "foo" to be String, but "number" is found.'); })); }); + describe('Page.authenticate', function() { it('should work', SX(async function() { server.setAuth('/empty.html', 'user', 'pass'); @@ -1588,6 +1591,7 @@ describe('Page', function() { expect(response.status).toBe(401); })); }); + describe('Page.setContent', function() { const expectedOutput = '
hello
'; it('should work', SX(async function() { @@ -1609,6 +1613,7 @@ describe('Page', function() { expect(result).toBe(`${doctype}${expectedOutput}`); })); }); + describe('Network Events', function() { it('Page.Events.Request', SX(async function() { const requests = []; @@ -2021,6 +2026,45 @@ describe('Page', function() { })); }); + describe('Page.select', function() { + it('should select single option', SX(async function() { + await page.goto(PREFIX + '/input/select.html'); + await page.select('select', 'blue'); + expect(await page.evaluate(() => result.onInput)).toEqual(['blue']); + expect(await page.evaluate(() => result.onChange)).toEqual(['blue']); + })); + + it('should select multiple options', SX(async function() { + await page.goto(PREFIX + '/input/select.html'); + await page.evaluate(() => makeMultiple()); + await page.select('select', 'blue', 'green', 'red'); + expect(await page.evaluate(() => result.onInput)).toEqual(['blue', 'green', 'red']); + expect(await page.evaluate(() => result.onChange)).toEqual(['blue', 'green', 'red']); + })); + + it('should work with no options', SX(async function() { + await page.goto(PREFIX + '/input/select.html'); + await page.evaluate(() => makeEmpty()); + await page.select('select', '42'); + expect(await page.evaluate(() => result.onInput)).toEqual([]); + expect(await page.evaluate(() => result.onChange)).toEqual([]); + })); + + it('should not select a non-existent option', SX(async function() { + await page.goto(PREFIX + '/input/select.html'); + await page.select('select', '42'); + expect(await page.evaluate(() => result.onInput)).toEqual([]); + expect(await page.evaluate(() => result.onChange)).toEqual([]); + })); + + it('should throw', SX(async function() { + let error = null; + await page.goto(PREFIX + '/input/select.html'); + await page.select('body', '').catch(e => error = e); + expect(error.message).toContain('Element is not a