diff --git a/types/puppeteer/index.d.ts b/types/puppeteer/index.d.ts index 66c73e1f96..682f8031f0 100644 --- a/types/puppeteer/index.d.ts +++ b/types/puppeteer/index.d.ts @@ -1,4 +1,4 @@ -// Type definitions for puppeteer 1.11 +// Type definitions for puppeteer 1.12 // Project: https://github.com/GoogleChrome/puppeteer#readme // Definitions by: Marvin Hagemeister // Christopher Deutsch @@ -346,10 +346,27 @@ export type ConsoleMessageType = "log" | "count" | "timeEnd"; +export interface ConsoleMessageLocation { + /** + * URL of the resource if known. + */ + url?: string; + /** + * Line number in the resource if known + */ + lineNumber?: number; + /** + * Column number in the resource if known. + */ + columnNumber?: number; +} + /** ConsoleMessage objects are dispatched by page via the 'console' event. */ export interface ConsoleMessage { /** The message arguments. */ args(): JSHandle[]; + /** The location the message originated from */ + location(): ConsoleMessageLocation; /** The message text. */ text(): string; type(): ConsoleMessageType; @@ -1087,18 +1104,22 @@ export interface Response { } export interface WaitForSelectorOptions extends Timeoutable { - /** - * Wait for element to be present in DOM and to be visible, - * i.e. to not have display: none or visibility: hidden CSS properties. - * @default false - */ - visible?: boolean; - /** - * Wait for element to not be found in the DOM or to be hidden, - * i.e. have display: none or visibility: hidden CSS properties. - * @default false - */ - hidden?: boolean; + /** + * Wait for element to be present in DOM and to be visible, + * i.e. to not have display: none or visibility: hidden CSS properties. + * @default false + */ + visible?: boolean; + /** + * Wait for element to not be found in the DOM or to be hidden, + * i.e. have display: none or visibility: hidden CSS properties. + * @default false + */ + hidden?: boolean; +} + +export interface WaitForSelectorOptionsHidden extends WaitForSelectorOptions { + hidden: true; } export interface FrameBase extends Evalable { @@ -1227,6 +1248,7 @@ export interface FrameBase extends Evalable { /** * Shortcut for waitForSelector and waitForXPath */ + waitFor(selector: string, options: WaitForSelectorOptionsHidden): Promise; waitFor(selector: string, options?: WaitForSelectorOptions): Promise; /** @@ -1257,6 +1279,10 @@ export interface FrameBase extends Evalable { selector: string, options?: WaitForSelectorOptions, ): Promise; + waitForSelector( + selector: string, + options?: WaitForSelectorOptionsHidden, + ): Promise; waitForXPath( xpath: string, @@ -1311,6 +1337,8 @@ export interface PageEventObj { metrics: { title: string, metrics: Metrics }; /** Emitted when an uncaught exception happens within the page. */ pageerror: Error; + /** Emitted when the page opens a new tab or window. */ + popup: Page; /** * Emitted when a page issues a request. The request object is read-only. * In order to intercept and mutate requests, see page.setRequestInterceptionEnabled. @@ -1523,6 +1551,9 @@ export interface Page extends EventEmitter, FrameBase { /** Get the browser the page belongs to. */ browser(): Browser; + /** Get the browser context that the page belongs to. */ + browserContext(): BrowserContext; + /** Closes the current page. */ close(options?: PageCloseOptions): Promise; @@ -1666,6 +1697,25 @@ export interface Page extends EventEmitter, FrameBase { */ setDefaultNavigationTimeout(timeout: number): void; + /** + * This setting will change the default maximum time for the following methods and related shortcuts: + * - `page.goBack` + * - `page.goForward` + * - `page.goto` + * - `page.reload` + * - `page.setContent` + * - `page.waitFor` + * - `page.waitForFunction` + * - `page.waitForNavigation` + * - `page.waitForRequest` + * - `page.waitForResponse` + * - `page.waitForSelector` + * - `page.waitForXPath` + * + * NOTE page.setDefaultNavigationTimeout takes priority over page.setDefaultTimeout + */ + setDefaultTimeout(timeout: number): void; + /** * The extra HTTP headers will be sent with every request the page initiates. * @param headers An object containing additional http headers to be sent with every request. All header values must be strings. @@ -2075,8 +2125,15 @@ export interface BrowserOptions { } export interface ConnectOptions extends BrowserOptions { + /** + * A browser url to connect to, in format `http://${host}:${port}`. + * Use interchangeably with browserWSEndpoint to let Puppeteer fetch it from metadata endpoint. + */ + browserURL?: string; + /** A browser websocket endpoint to connect to. */ browserWSEndpoint?: string; + /** * **Experimental** Specify a custom transport object for Puppeteer to use. */ diff --git a/types/puppeteer/puppeteer-tests.ts b/types/puppeteer/puppeteer-tests.ts index 6c74a780c2..cfefaddb1d 100644 --- a/types/puppeteer/puppeteer-tests.ts +++ b/types/puppeteer/puppeteer-tests.ts @@ -30,6 +30,7 @@ import * as Devices from "puppeteer/DeviceDescriptors"; (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); + page.setDefaultTimeout(100000); await page.goto("https://news.ycombinator.com", { waitUntil: "networkidle0" }); await page.pdf({ path: "hn.pdf", format: "A4" }); @@ -129,7 +130,11 @@ puppeteer.launch().then(async browser => { interceptedRequest.url().endsWith(".jpg") ) interceptedRequest.abort(); - else interceptedRequest.continue(); + else interceptedRequest.continue({ + headers: { + dope: 'yes', + } + }); }); page.keyboard.type("Hello"); // Types instantly @@ -237,13 +242,13 @@ puppeteer.launch().then(async browser => { page.type("#myInput", "Hello World!"); page.on("console", (event: puppeteer.ConsoleMessage, ...args: any[]) => { - console.log(event.text, event.type); + console.log(event.text(), event.type(), event.location()); for (let i = 0; i < args.length; ++i) console.log(`${i}: ${args[i]}`); }); await button.focus(); await button.press("Enter"); - await button.screenshot({ + const screenshotOpts: puppeteer.BinaryScreenShotOptions = { type: "jpeg", omitBackground: true, clip: { @@ -252,7 +257,8 @@ puppeteer.launch().then(async browser => { width: 200, height: 100 } - }); + }; + await button.screenshot(screenshotOpts); console.log(button.toString()); input.type("Hello World", { delay: 10 }); @@ -262,11 +268,15 @@ puppeteer.launch().then(async browser => { const metrics = await page.metrics(); console.log(metrics.Documents, metrics.Frames, metrics.JSEventListeners); + page.on('metrics', data => { + const title: string = data.title; + const metrics: puppeteer.Metrics = data.metrics; + }); const navResponse = await page.waitForNavigation({ timeout: 1000 }); - console.log(navResponse.ok, navResponse.status, navResponse.url, navResponse.headers); + console.log(navResponse.ok(), navResponse.status(), navResponse.url(), navResponse.headers()['Content-Type']); // evaluate example const bodyHandle = (await page.$('body'))!; @@ -309,7 +319,7 @@ puppeteer.launch().then(async browser => { const elementText = await page.$eval( '#someElement', ( - element, // $ExpectType Element + element, // $ExpectType Element ) => { element.innerHTML; // $ExpectType string return element.innerHTML; @@ -340,15 +350,19 @@ puppeteer.launch().then(async browser => { (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); - const handler = (r: puppeteer.Request) => { + const handler = async (r: puppeteer.Request) => { const failure = r.failure(); + console.log(r.headers().Test); + const response = r.response(); if (!response) { return; } const text: string = response.statusText(); const ip: string = response.remoteAddress().ip; + const data = (await response.json()) as string; + const randomHeader = response.headers().Test; if (failure == null) { console.error("Request completed successfully"); @@ -454,13 +468,16 @@ puppeteer.launch().then(async browser => { (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); - await page.waitFor(1000); - await page.waitFor('selector'); - await page.waitFor('selector', { + await page.waitFor(1000); // $ExpectType void + const el: puppeteer.ElementHandle = await page.waitFor('selector'); + const nullableEl: puppeteer.ElementHandle | null = await page.waitFor('selector', { + hidden: true, + }); + const el2: puppeteer.ElementHandle = await page.waitFor('selector', { timeout: 123, }); await page.waitFor(() => !!document.querySelector('.foo'), { - hidden: true, + hidden: true, }); await page.waitFor((stuff: string) => !!document.querySelector(stuff), { hidden: true, @@ -496,11 +513,11 @@ puppeteer.launch().then(async browser => { (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); - try { - await page.waitFor('test'); - } catch (err) { - console.log(err instanceof TimeoutError); - } + try { + await page.waitFor('test'); + } catch (err) { + console.log(err instanceof TimeoutError); + } }); // domcontentloaded page event test @@ -513,3 +530,20 @@ puppeteer.launch().then(async browser => { }); }); }); + +// Element access +(async () => { + const browser = await puppeteer.launch(); + const page = await browser.newPage(); + const el = await page.$('input'); + const val: string = await (await el!.getProperty('type')).jsonValue(); +}); + +// Request manipualtion +(async () => { + const browser = await puppeteer.launch(); + const page = await browser.newPage(); + await page.setExtraHTTPHeaders({ + a: '1' + }); +});