Merge pull request #32723 from SimonSchick/feat/puppeteer-v1.12

feat(puppeteer): v1.12
This commit is contained in:
Pranav Senthilnathan 2019-02-01 17:03:58 -08:00 committed by GitHub
commit c214d32234
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 120 additions and 29 deletions

View File

@ -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 <https://github.com/marvinhagemeister>
// Christopher Deutsch <https://github.com/cdeutsch>
@ -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<ElementHandle | null>;
waitFor(selector: string, options?: WaitForSelectorOptions): Promise<ElementHandle>;
/**
@ -1257,6 +1279,10 @@ export interface FrameBase extends Evalable {
selector: string,
options?: WaitForSelectorOptions,
): Promise<ElementHandle>;
waitForSelector(
selector: string,
options?: WaitForSelectorOptionsHidden,
): Promise<ElementHandle | null>;
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<void>;
@ -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.
*/

View File

@ -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'
});
});