Back to directory
hardkoded avatar
hardkoded / puppeteer-sharp

puppeteer-sharp

Headless Chrome .NET API

3,911

Stars

483

Forks

55

Watchers

MIT

License

Puppeteer Sharp

NuGet Build status Demo build status CodeFactor Backers

Puppeteer Sharp is a .NET port of the official Node.JS Puppeteer API.

Recent news

Test the latest Firefox versions using WebDriver BiDi! Check the PuppeteerSharp 21 release notes.

PuppeteerSharp now supports AOT compilation! Check the PuppeteerSharp 19 release notes!.

Published Packages

Package Description
PuppeteerSharp Our full cross-browser automation tool
PuppeteerSharp.Cdp Ideal for Chrome-only AOT apps where binary size matters
PuppeteerSharp.AspNetFramework The companion library you need to run PuppeteerSharp in ASP.NET Classic

Prerequisites

  • Puppeteer-Sharp comes in two flavors: a NetStandard 2.0 library for .NET Framework 4.6.1 and .NET Core 2.0 or greater and a .NET 8 version.
  • If you have issues running Chrome on Linux, the Puppeteer repo has a great troubleshooting guide.
  • X-server is required on Linux.

How to Contribute and Provide Feedback

Some of the best ways to contribute are to try things out file bugs and fix issues.

If you have an issue or a question:

Contributing Guide

See this document for information on how to contribute.

Usage

Take screenshots

var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(
    new LaunchOptions { Headless = true });
await using var page = await browser.NewPageAsync();
await page.GoToAsync("http://www.google.com");
await page.ScreenshotAsync(outputFile);

snippet source | anchor

You can also change the view port before generating the screenshot

await Page.SetViewportAsync(new ViewPortOptions
{
    Width = 500,
    Height = 500
});

snippet source | anchor

Generate PDF files

var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
await using var page = await browser.NewPageAsync();
await page.GoToAsync("http://www.google.com"); // In case of fonts being loaded from a CDN, use WaitUntilNavigation.Networkidle0 as a second param.
await page.EvaluateExpressionHandleAsync("document.fonts.ready"); // Wait for fonts to be loaded. Omitting this might result in no text rendered in pdf.
await page.PdfAsync(outputFile);

snippet source | anchor

Inject HTML

await using var page = await browser.NewPageAsync();
await page.SetContentAsync("<div>My Receipt</div>");
var result = await page.GetContentAsync();

snippet source | anchor

Evaluate Javascript

await using var page = await browser.NewPageAsync();
var seven = await page.EvaluateExpressionAsync<int>("4 + 3");
var someObject = await page.EvaluateFunctionAsync<JsonElement>("(value) => ({a: value})", 5);
Console.WriteLine(someObject.GetProperty("a").GetString());

snippet source | anchor

Wait For Selector

using (var page = await browser.NewPageAsync())
{
    await page.GoToAsync("http://www.spapage.com");
    await page.WaitForSelectorAsync("div.main-content")
    await page.PdfAsync(outputFile));
}

Wait For Function

using (var page = await browser.NewPageAsync())
{
    await page.GoToAsync("http://www.spapage.com");
    var watchDog = page.WaitForFunctionAsync("()=> window.innerWidth < 100");
    await page.SetViewportAsync(new ViewPortOptions { Width = 50, Height = 50 });
    await watchDog;
}

Connect to a remote browser

var options = new ConnectOptions()
{
    BrowserWSEndpoint = $"wss://www.externalbrowser.io?token={apikey}"
};

var url = "https://www.google.com/";

using (var browser = await PuppeteerSharp.Puppeteer.ConnectAsync(options))
{
    using (var page = await browser.NewPageAsync())
    {
        await page.GoToAsync(url);
        await page.PdfAsync("wot.pdf");
    }
}

Sponsors

A massive thanks to JetBrains for a community Resharper and Rider license to use on this project.

JetBrains logo.

And a huge thanks to everyone who sponsors this project through Github sponsors:

User avatar: Tolga BalciUser avatar: Richard GarsideUser avatar: HTML/CSS to Image APIUser avatar: Iron Software

Releases

What's Changed

fix: PWA launch returning a page with an empty URL on Windows by @kblok in #3529 fix: bound CdpPage.CloseAsync's wait for target close confirmation by @kblok in #3530 fix: close remain...

What's Changed

Roll Chrome to 151.0.7922.47 (#15237) by @kblok in #3524 New Feature: Add browser-level PWA install/launch/uninstall APIs (#15235) by @kblok in #3523 New Feature: Expose Handled getter...

What's Changed

Fix #3517: CreateCDPSessionAsync never delivers events for worker targets by @kblok in #3518

Full Changelog: v25.3.3...v25.3.4

What's Changed

Fix Native AOT crash from missing JsonSerializable registrations by @kblok in #3516

Full Changelog: v25.3.2...v25.3.3

What's Changed

Fix Locator.SetVisibility(Hidden).WaitAsync() resolving immediately by @kblok in #3514

Full Changelog: v25.3.1...v25.3.2