diff --git a/src/browserContext.ts b/src/browserContext.ts index 439c8e13ed..48dad9fee3 100644 --- a/src/browserContext.ts +++ b/src/browserContext.ts @@ -16,7 +16,6 @@ */ import { Page } from './page'; -import * as input from './input'; import * as network from './network'; import * as types from './types'; @@ -40,8 +39,8 @@ export type BrowserContextOptions = { ignoreHTTPSErrors?: boolean, javaScriptEnabled?: boolean, bypassCSP?: boolean, - mediaType?: input.MediaType, - colorScheme?: input.ColorScheme, + mediaType?: types.MediaType, + colorScheme?: types.ColorScheme, userAgent?: string, timezoneId?: string, geolocation?: types.Geolocation diff --git a/src/chromium/crPage.ts b/src/chromium/crPage.ts index 503bbf128c..650d295ce5 100644 --- a/src/chromium/crPage.ts +++ b/src/chromium/crPage.ts @@ -36,7 +36,6 @@ import { CRWorkers, CRWorker } from './features/crWorkers'; import { CRBrowser } from './crBrowser'; import { BrowserContext } from '../browserContext'; import * as types from '../types'; -import * as input from '../input'; import { ConsoleMessage } from '../console'; import * as accessibility from '../accessibility'; @@ -309,8 +308,8 @@ export class CRPage implements PageDelegate { ]); } - async setEmulateMedia(mediaType: input.MediaType | null, mediaColorScheme: input.ColorScheme | null): Promise { - const features = mediaColorScheme ? [{ name: 'prefers-color-scheme', value: mediaColorScheme }] : []; + async setEmulateMedia(mediaType: types.MediaType | null, colorScheme: types.ColorScheme | null): Promise { + const features = colorScheme ? [{ name: 'prefers-color-scheme', value: colorScheme }] : []; await this._client.send('Emulation.setEmulatedMedia', { media: mediaType || '', features }); } @@ -459,8 +458,8 @@ export class CRPage implements PageDelegate { return { width: layoutMetrics.layoutViewport.clientWidth, height: layoutMetrics.layoutViewport.clientHeight }; } - async setInputFiles(handle: dom.ElementHandle, files: input.FilePayload[]): Promise { - await handle.evaluate(input.setFileInputFunction, files); + async setInputFiles(handle: dom.ElementHandle, files: types.FilePayload[]): Promise { + await handle.evaluate(dom.setFileInputFunction, files); } async adoptElementHandle(handle: dom.ElementHandle, to: dom.FrameExecutionContext): Promise> { diff --git a/src/dom.ts b/src/dom.ts index a9d2fccbe3..1cff19f23f 100644 --- a/src/dom.ts +++ b/src/dom.ts @@ -10,6 +10,10 @@ import * as zsSelectorEngineSource from './generated/zsSelectorEngineSource'; import { assert, helper, debugError } from './helper'; import Injected from './injected/injected'; import { Page } from './page'; +import * as path from 'path'; +import * as fs from 'fs'; + +const readFileAsync = helper.promisify(fs.readFile); export class FrameExecutionContext extends js.ExecutionContext { readonly frame: frames.Frame; @@ -284,7 +288,7 @@ export class ElementHandle extends js.JSHandle { return this._performPointerAction(point => this._page.mouse.tripleclick(point.x, point.y, options), options); } - async select(...values: (string | ElementHandle | input.SelectOption)[]): Promise { + async select(...values: (string | ElementHandle | types.SelectOption)[]): Promise { const options = values.map(value => typeof value === 'object' ? value : { value }); for (const option of options) { if (option instanceof ElementHandle) @@ -296,18 +300,92 @@ export class ElementHandle extends js.JSHandle { if (option.index !== undefined) assert(helper.isNumber(option.index), 'Indices must be numbers. Found index "' + option.index + '" of type "' + (typeof option.index) + '"'); } - return this._evaluateInUtility(input.selectFunction, ...options); + return this._evaluateInUtility((node: Node, ...optionsToSelect: (Node | types.SelectOption)[]) => { + if (node.nodeName.toLowerCase() !== 'select') + throw new Error('Element is not a ,