or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

browser-contexts.mdbrowser-management.mdelement-handling.mdindex.mdinput-simulation.mdlocators-selectors.mdnetwork-management.mdpage-interaction.md

page-interaction.mddocs/

0

# Page Navigation and Interaction

1

2

Complete page automation including navigation, element interaction, JavaScript execution, and content extraction.

3

4

## Capabilities

5

6

### Page Interface

7

8

Main interface for interacting with browser pages, providing navigation, content manipulation, and event handling.

9

10

```typescript { .api }

11

interface Page extends EventEmitter {

12

/** Navigate to URL */

13

goto(url: string, options?: GoToOptions): Promise<HTTPResponse | null>;

14

/** Reload current page */

15

reload(options?: ReloadOptions): Promise<HTTPResponse | null>;

16

/** Go back in history */

17

goBack(options?: GoToOptions): Promise<HTTPResponse | null>;

18

/** Go forward in history */

19

goForward(options?: GoToOptions): Promise<HTTPResponse | null>;

20

/** Set viewport size */

21

setViewport(viewport: Viewport): Promise<void>;

22

/** Get current viewport */

23

viewport(): Viewport | null;

24

/** Take screenshot */

25

screenshot(options?: ScreenshotOptions): Promise<Buffer>;

26

/** Generate PDF */

27

pdf(options?: PDFOptions): Promise<Buffer>;

28

/** Get page title */

29

title(): Promise<string>;

30

/** Get page URL */

31

url(): string;

32

/** Get page content as HTML */

33

content(): Promise<string>;

34

/** Set page content */

35

setContent(html: string, options?: GoToOptions): Promise<void>;

36

/** Evaluate JavaScript in page context */

37

evaluate<T>(pageFunction: Function, ...args: any[]): Promise<T>;

38

/** Evaluate JavaScript with handle return */

39

evaluateHandle<T>(pageFunction: Function, ...args: any[]): Promise<JSHandle<T>>;

40

/** Add script tag to page */

41

addScriptTag(options: ScriptTagOptions): Promise<ElementHandle>;

42

/** Add style tag to page */

43

addStyleTag(options: StyleTagOptions): Promise<ElementHandle>;

44

/** Expose function to page context */

45

exposeFunction(name: string, puppeteerFunction: Function): Promise<void>;

46

/** Remove exposed function */

47

removeExposedFunction(name: string): Promise<void>;

48

/** Set geolocation */

49

setGeolocation(options: GeolocationOptions): Promise<void>;

50

/** Set timezone */

51

emulateTimezone(timezoneId: string): Promise<void>;

52

/** Emulate media type */

53

emulateMediaType(type?: "screen" | "print" | null): Promise<void>;

54

/** Emulate media features */

55

emulateMediaFeatures(features?: MediaFeature[]): Promise<void>;

56

/** Emulate vision deficiency */

57

emulateVisionDeficiency(type?: VisionDeficiency): Promise<void>;

58

/** Set JavaScript enabled state */

59

setJavaScriptEnabled(enabled: boolean): Promise<void>;

60

/** Set offline mode */

61

setOfflineMode(enabled: boolean): Promise<void>;

62

/** Set request interception */

63

setRequestInterception(value: boolean): Promise<void>;

64

/** Set user agent */

65

setUserAgent(userAgent: string, userAgentMetadata?: UserAgentMetadata): Promise<void>;

66

/** Set extra HTTP headers */

67

setExtraHTTPHeaders(headers: Record<string, string>): Promise<void>;

68

/** Authenticate with HTTP credentials */

69

authenticate(credentials: Credentials | null): Promise<void>;

70

/** Get/set cookies */

71

cookies(...urls: string[]): Promise<Cookie[]>;

72

setCookie(...cookies: CookieParam[]): Promise<void>;

73

deleteCookie(...cookies: DeleteCookiesRequest[]): Promise<void>;

74

/** Click element */

75

click(selector: string, options?: ClickOptions): Promise<void>;

76

/** Focus element */

77

focus(selector: string): Promise<void>;

78

/** Hover element */

79

hover(selector: string): Promise<void>;

80

/** Select options */

81

select(selector: string, ...values: string[]): Promise<string[]>;

82

/** Tap element (mobile) */

83

tap(selector: string): Promise<void>;

84

/** Type text */

85

type(selector: string, text: string, options?: TypeOptions): Promise<void>;

86

/** Wait for selector */

87

waitForSelector(selector: string, options?: WaitForSelectorOptions): Promise<ElementHandle | null>;

88

/** Wait for XPath */

89

waitForXPath(xpath: string, options?: WaitForSelectorOptions): Promise<ElementHandle | null>;

90

/** Wait for function result */

91

waitForFunction(pageFunction: Function, options?: WaitForFunctionOptions, ...args: any[]): Promise<JSHandle>;

92

/** Wait for request */

93

waitForRequest(urlOrPredicate: string | Function, options?: WaitForOptions): Promise<HTTPRequest>;

94

/** Wait for response */

95

waitForResponse(urlOrPredicate: string | Function, options?: WaitForOptions): Promise<HTTPResponse>;

96

/** Wait for navigation */

97

waitForNavigation(options?: WaitForOptions): Promise<HTTPResponse | null>;

98

/** Wait for timeout */

99

waitForTimeout(milliseconds: number): Promise<void>;

100

/** Query selector */

101

$(selector: string): Promise<ElementHandle | null>;

102

/** Query selector all */

103

$$(selector: string): Promise<ElementHandle[]>;

104

/** Evaluate with selector */

105

$eval<T>(selector: string, pageFunction: Function, ...args: any[]): Promise<T>;

106

/** Evaluate with selector all */

107

$$eval<T>(selector: string, pageFunction: Function, ...args: any[]): Promise<T>;

108

/** XPath query */

109

$x(expression: string): Promise<ElementHandle[]>;

110

/** Get browser instance */

111

browser(): Browser;

112

/** Get browser context */

113

browserContext(): BrowserContext;

114

/** Get main frame */

115

mainFrame(): Frame;

116

/** Get all frames */

117

frames(): Frame[];

118

/** Get all workers */

119

workers(): WebWorker[];

120

/** Create CDP session */

121

createCDPSession(): Promise<CDPSession>;

122

/** Get target */

123

target(): Target;

124

/** Get keyboard interface */

125

keyboard: Keyboard;

126

/** Get mouse interface */

127

mouse: Mouse;

128

/** Get touchscreen interface */

129

touchscreen: Touchscreen;

130

/** Get coverage interface */

131

coverage: Coverage;

132

/** Get tracing interface */

133

tracing: Tracing;

134

/** Get accessibility interface */

135

accessibility: Accessibility;

136

/** Check if closed */

137

isClosed(): boolean;

138

/** Close page */

139

close(options?: PageCloseOptions): Promise<void>;

140

/** Check if JavaScript enabled */

141

isJavaScriptEnabled(): boolean;

142

/** Check if drag interception enabled */

143

isDragInterceptionEnabled(): boolean;

144

/** Set drag interception */

145

setDragInterception(enabled: boolean): Promise<void>;

146

}

147

148

interface GoToOptions {

149

timeout?: number;

150

waitUntil?: PuppeteerLifeCycleEvent | PuppeteerLifeCycleEvent[];

151

referer?: string;

152

}

153

154

interface ReloadOptions {

155

timeout?: number;

156

waitUntil?: PuppeteerLifeCycleEvent | PuppeteerLifeCycleEvent[];

157

}

158

159

type PuppeteerLifeCycleEvent = "load" | "domcontentloaded" | "networkidle0" | "networkidle2";

160

161

interface ScreenshotOptions {

162

type?: "png" | "jpeg" | "webp";

163

path?: string;

164

fullPage?: boolean;

165

clip?: BoundingBox;

166

quality?: number;

167

omitBackground?: boolean;

168

encoding?: "base64" | "binary";

169

captureBeyondViewport?: boolean;

170

fromSurface?: boolean;

171

}

172

173

interface PDFOptions {

174

scale?: number;

175

displayHeaderFooter?: boolean;

176

headerTemplate?: string;

177

footerTemplate?: string;

178

printBackground?: boolean;

179

landscape?: boolean;

180

pageRanges?: string;

181

format?: PaperFormat;

182

width?: string | number;

183

height?: string | number;

184

preferCSSPageSize?: boolean;

185

margin?: {

186

top?: string | number;

187

right?: string | number;

188

bottom?: string | number;

189

left?: string | number;

190

};

191

path?: string;

192

timeout?: number;

193

tagged?: boolean;

194

waitForFonts?: boolean;

195

}

196

197

type PaperFormat = "Letter" | "Legal" | "Tabloid" | "Ledger" | "A0" | "A1" | "A2" | "A3" | "A4" | "A5" | "A6";

198

199

interface ScriptTagOptions {

200

url?: string;

201

path?: string;

202

content?: string;

203

type?: string;

204

id?: string;

205

}

206

207

interface StyleTagOptions {

208

url?: string;

209

path?: string;

210

content?: string;

211

}

212

213

interface GeolocationOptions {

214

latitude: number;

215

longitude: number;

216

accuracy?: number;

217

}

218

219

interface MediaFeature {

220

name: string;

221

value: string;

222

}

223

224

type VisionDeficiency = "achromatopsia" | "blurredVision" | "deuteranopia" | "protanopia" | "tritanopia" | null;

225

226

interface UserAgentMetadata {

227

brands?: Array<{ brand: string; version: string }>;

228

fullVersionList?: Array<{ brand: string; version: string }>;

229

fullVersion?: string;

230

platform?: string;

231

platformVersion?: string;

232

architecture?: string;

233

model?: string;

234

mobile?: boolean;

235

bitness?: string;

236

wow64?: boolean;

237

}

238

239

interface Credentials {

240

username: string;

241

password: string;

242

}

243

244

interface CookieParam {

245

name: string;

246

value: string;

247

url?: string;

248

domain?: string;

249

path?: string;

250

secure?: boolean;

251

httpOnly?: boolean;

252

sameSite?: "Strict" | "Lax" | "None";

253

expires?: number;

254

priority?: "Low" | "Medium" | "High";

255

sameParty?: boolean;

256

sourceScheme?: "Unset" | "NonSecure" | "Secure";

257

partitionKey?: string;

258

}

259

260

interface DeleteCookiesRequest {

261

name: string;

262

url?: string;

263

domain?: string;

264

path?: string;

265

partitionKey?: string;

266

}

267

268

interface ClickOptions {

269

button?: "left" | "right" | "middle";

270

clickCount?: number;

271

delay?: number;

272

offset?: { x: number; y: number };

273

}

274

275

interface TypeOptions {

276

delay?: number;

277

}

278

279

interface WaitForSelectorOptions {

280

visible?: boolean;

281

hidden?: boolean;

282

timeout?: number;

283

}

284

285

interface WaitForFunctionOptions {

286

timeout?: number;

287

polling?: "raf" | "mutation" | number;

288

}

289

290

interface WaitForOptions {

291

timeout?: number;

292

waitUntil?: PuppeteerLifeCycleEvent | PuppeteerLifeCycleEvent[];

293

}

294

295

interface PageCloseOptions {

296

runBeforeUnload?: boolean;

297

}

298

```

299

300

**Usage Examples:**

301

302

```typescript

303

import puppeteer from "puppeteer-core";

304

305

const browser = await puppeteer.launch({ executablePath: "/path/to/chrome" });

306

const page = await browser.newPage();

307

308

// Navigation

309

await page.goto("https://example.com", {

310

waitUntil: "networkidle0",

311

timeout: 30000

312

});

313

314

await page.setViewport({ width: 1024, height: 768 });

315

316

// Content extraction

317

const title = await page.title();

318

const content = await page.content();

319

const url = page.url();

320

321

// Screenshots and PDFs

322

await page.screenshot({

323

path: "screenshot.png",

324

fullPage: true

325

});

326

327

await page.pdf({

328

path: "page.pdf",

329

format: "A4",

330

printBackground: true

331

});

332

333

// JavaScript evaluation

334

const result = await page.evaluate(() => {

335

return document.querySelector("h1")?.textContent;

336

});

337

338

const handle = await page.evaluateHandle(() => document.body);

339

340

// Form interaction

341

await page.type("#username", "user@example.com");

342

await page.type("#password", "password123");

343

await page.click("#login-button");

344

345

// Wait for navigation

346

await page.waitForNavigation({ waitUntil: "networkidle0" });

347

348

// Cookies

349

await page.setCookie({

350

name: "session",

351

value: "abc123",

352

domain: "example.com"

353

});

354

355

const cookies = await page.cookies();

356

357

await browser.close();

358

```

359

360

### Page Events

361

362

The Page class emits various events during its lifecycle:

363

364

```typescript { .api }

365

interface PageEvents {

366

/** Emitted when page closes */

367

"close": () => void;

368

/** Emitted when page crashes */

369

"error": (error: Error) => void;

370

/** Emitted when page loads */

371

"load": () => void;

372

/** Emitted when DOM content loads */

373

"domcontentloaded": () => void;

374

/** Emitted when JavaScript console API called */

375

"console": (message: ConsoleMessage) => void;

376

/** Emitted when JavaScript dialog appears */

377

"dialog": (dialog: Dialog) => void;

378

/** Emitted when request starts */

379

"request": (request: HTTPRequest) => void;

380

/** Emitted when response received */

381

"response": (response: HTTPResponse) => void;

382

/** Emitted when request fails */

383

"requestfailed": (request: HTTPRequest) => void;

384

/** Emitted when request finishes */

385

"requestfinished": (request: HTTPRequest) => void;

386

/** Emitted when frame attaches */

387

"frameattached": (frame: Frame) => void;

388

/** Emitted when frame detaches */

389

"framedetached": (frame: Frame) => void;

390

/** Emitted when frame navigates */

391

"framenavigated": (frame: Frame) => void;

392

/** Emitted when worker created */

393

"workercreated": (worker: WebWorker) => void;

394

/** Emitted when worker destroyed */

395

"workerdestroyed": (worker: WebWorker) => void;

396

/** Emitted when page metrics updated */

397

"metrics": (data: { title: string; metrics: Metrics }) => void;

398

/** Emitted when file chooser appears */

399

"filechooser": (fileChooser: FileChooser) => void;

400

/** Emitted on popup */

401

"popup": (page: Page) => void;

402

}

403

404

interface Metrics {

405

Timestamp?: number;

406

AudioHandlers?: number;

407

Documents?: number;

408

Frames?: number;

409

JSEventListeners?: number;

410

Nodes?: number;

411

LayoutCount?: number;

412

RecalcStyleCount?: number;

413

LayoutDuration?: number;

414

RecalcStyleDuration?: number;

415

ScriptDuration?: number;

416

TaskDuration?: number;

417

JSHeapUsedSize?: number;

418

JSHeapTotalSize?: number;

419

}

420

```

421

422

### Console Messages

423

424

Handle browser console output:

425

426

```typescript { .api }

427

interface ConsoleMessage {

428

type(): "log" | "debug" | "info" | "error" | "warning" | "dir" | "dirxml" | "table" | "trace" | "clear" | "startGroup" | "startGroupCollapsed" | "endGroup" | "assert" | "profile" | "profileEnd" | "count" | "timeEnd";

429

text(): string;

430

args(): JSHandle[];

431

location(): ConsoleMessageLocation;

432

stackTrace(): ConsoleMessageLocation[];

433

}

434

435

interface ConsoleMessageLocation {

436

url?: string;

437

lineNumber?: number;

438

columnNumber?: number;

439

}

440

```

441

442

### Dialog Handling

443

444

Handle JavaScript dialogs (alert, confirm, prompt):

445

446

```typescript { .api }

447

interface Dialog {

448

type(): "alert" | "beforeunload" | "confirm" | "prompt";

449

message(): string;

450

defaultValue(): string;

451

accept(promptText?: string): Promise<void>;

452

dismiss(): Promise<void>;

453

}

454

```

455

456

**Usage Examples:**

457

458

```typescript

459

// Handle dialogs

460

page.on("dialog", async (dialog) => {

461

console.log("Dialog type:", dialog.type());

462

console.log("Dialog message:", dialog.message());

463

464

if (dialog.type() === "confirm") {

465

await dialog.accept();

466

} else {

467

await dialog.dismiss();

468

}

469

});

470

471

// Handle console messages

472

page.on("console", (msg) => {

473

console.log(`PAGE LOG: ${msg.text()}`);

474

});

475

476

// Handle page events

477

page.on("load", () => console.log("Page loaded"));

478

page.on("requestfailed", (req) => {

479

console.log("Request failed:", req.url());

480

});

481

```

482

483

### File Handling

484

485

Handle file uploads and downloads:

486

487

```typescript { .api }

488

interface FileChooser {

489

isMultiple(): boolean;

490

accept(filePaths: string[]): Promise<void>;

491

cancel(): Promise<void>;

492

}

493

```

494

495

**Usage Examples:**

496

497

```typescript

498

// Handle file chooser

499

const [fileChooser] = await Promise.all([

500

page.waitForEvent("filechooser"),

501

page.click("#upload-button")

502

]);

503

504

await fileChooser.accept(["/path/to/file.txt"]);

505

506

// Set download behavior

507

const client = await page.createCDPSession();

508

await client.send("Page.setDownloadBehavior", {

509

behavior: "allow",

510

downloadPath: "/path/to/downloads"

511

});

512

```

513

514

### Advanced Page Features

515

516

Additional page capabilities for complex scenarios:

517

518

```typescript { .api }

519

interface Coverage {

520

startJSCoverage(options?: JSCoverageOptions): Promise<void>;

521

stopJSCoverage(): Promise<JSCoverageEntry[]>;

522

startCSSCoverage(options?: CSSCoverageOptions): Promise<void>;

523

stopCSSCoverage(): Promise<CSSCoverageEntry[]>;

524

}

525

526

interface Tracing {

527

start(options?: TracingOptions): Promise<void>;

528

stop(): Promise<Buffer>;

529

}

530

531

interface Accessibility {

532

snapshot(options?: SnapshotOptions): Promise<SerializedAXNode | null>;

533

}

534

535

interface JSCoverageOptions {

536

resetOnNavigation?: boolean;

537

reportAnonymousScripts?: boolean;

538

includeRawScriptCoverage?: boolean;

539

useBlockCoverage?: boolean;

540

}

541

542

interface CSSCoverageOptions {

543

resetOnNavigation?: boolean;

544

}

545

546

interface TracingOptions {

547

path?: string;

548

screenshots?: boolean;

549

categories?: string[];

550

}

551

552

interface SnapshotOptions {

553

interestingOnly?: boolean;

554

root?: ElementHandle;

555

}

556

```

557

558

**Usage Examples:**

559

560

```typescript

561

// Code coverage

562

await page.coverage.startJSCoverage();

563

await page.goto("https://example.com");

564

const jsCoverage = await page.coverage.stopJSCoverage();

565

566

// Performance tracing

567

await page.tracing.start({ path: "trace.json" });

568

await page.goto("https://example.com");

569

await page.tracing.stop();

570

571

// Accessibility tree

572

const snapshot = await page.accessibility.snapshot();

573

console.log(JSON.stringify(snapshot, null, 2));

574

```