/**
* Copyright 2017 Google Inc. All rights reserved.
* Modifications copyright (c) Microsoft Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const path = require('path');
const util = require('util');
const vm = require('vm');
const {FFOX, CHROMIUM, WEBKIT, WIN, USES_HOOKS, CHANNEL} = testOptions;
async function giveItAChanceToFill(page) {
for (let i = 0; i < 5; i++)
await page.evaluate(() => new Promise(f => requestAnimationFrame(() => requestAnimationFrame(f))));
}
it('should fill textarea', async({page, server}) => {
await page.goto(server.PREFIX + '/input/textarea.html');
await page.fill('textarea', 'some value');
expect(await page.evaluate(() => result)).toBe('some value');
});
it('should fill input', async({page, server}) => {
await page.goto(server.PREFIX + '/input/textarea.html');
await page.fill('input', 'some value');
expect(await page.evaluate(() => result)).toBe('some value');
});
it('should throw on unsupported inputs', async({page, server}) => {
await page.goto(server.PREFIX + '/input/textarea.html');
for (const type of ['color', 'file']) {
await page.$eval('input', (input, type) => input.setAttribute('type', type), type);
let error = null;
await page.fill('input', '').catch(e => error = e);
expect(error.message).toContain(`input of type "${type}" cannot be filled`);
}
});
it('should fill different input types', async({page, server}) => {
await page.goto(server.PREFIX + '/input/textarea.html');
for (const type of ['password', 'search', 'tel', 'text', 'url']) {
await page.$eval('input', (input, type) => input.setAttribute('type', type), type);
await page.fill('input', 'text ' + type);
expect(await page.evaluate(() => result)).toBe('text ' + type);
}
});
it('should fill date input after clicking', async({page, server}) => {
await page.setContent('');
await page.click('input');
await page.fill('input', '2020-03-02');
expect(await page.$eval('input', input => input.value)).toBe('2020-03-02');
});
it.skip(WEBKIT)('should throw on incorrect date', async({page, server}) => {
await page.setContent('');
const error = await page.fill('input', '2020-13-05').catch(e => e);
expect(error.message).toContain('Malformed value');
});
it('should fill time input', async({page, server}) => {
await page.setContent('');
await page.fill('input', '13:15');
expect(await page.$eval('input', input => input.value)).toBe('13:15');
});
it.skip(WEBKIT)('should throw on incorrect time', async({page, server}) => {
await page.setContent('');
const error = await page.fill('input', '25:05').catch(e => e);
expect(error.message).toContain('Malformed value');
});
it('should fill datetime-local input', async({page, server}) => {
await page.setContent('');
await page.fill('input', '2020-03-02T05:15');
expect(await page.$eval('input', input => input.value)).toBe('2020-03-02T05:15');
});
it.skip(WEBKIT || FFOX)('should throw on incorrect datetime-local', async({page, server}) => {
await page.setContent('');
const error = await page.fill('input', 'abc').catch(e => e);
expect(error.message).toContain('Malformed value');
});
it('should fill contenteditable', async({page, server}) => {
await page.goto(server.PREFIX + '/input/textarea.html');
await page.fill('div[contenteditable]', 'some value');
expect(await page.$eval('div[contenteditable]', div => div.textContent)).toBe('some value');
});
it('should fill elements with existing value and selection', async({page, server}) => {
await page.goto(server.PREFIX + '/input/textarea.html');
await page.$eval('input', input => input.value = 'value one');
await page.fill('input', 'another value');
expect(await page.evaluate(() => result)).toBe('another value');
await page.$eval('input', input => {
input.selectionStart = 1;
input.selectionEnd = 2;
});
await page.fill('input', 'maybe this one');
expect(await page.evaluate(() => result)).toBe('maybe this one');
await page.$eval('div[contenteditable]', div => {
div.innerHTML = 'some text some more text and even more text';
const range = document.createRange();
range.selectNodeContents(div.querySelector('span'));
const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
});
await page.fill('div[contenteditable]', 'replace with this');
expect(await page.$eval('div[contenteditable]', div => div.textContent)).toBe('replace with this');
});
it('should throw when element is not an ,