![]() |
VOOZH | about |
dotnet add package PuppeteerSharp.Contrib.Extensions --version 7.0.0
NuGet\Install-Package PuppeteerSharp.Contrib.Extensions -Version 7.0.0
<PackageReference Include="PuppeteerSharp.Contrib.Extensions" Version="7.0.0" />
<PackageVersion Include="PuppeteerSharp.Contrib.Extensions" Version="7.0.0" />Directory.Packages.props
<PackageReference Include="PuppeteerSharp.Contrib.Extensions" />Project file
paket add PuppeteerSharp.Contrib.Extensions --version 7.0.0
#r "nuget: PuppeteerSharp.Contrib.Extensions, 7.0.0"
#:package PuppeteerSharp.Contrib.Extensions@7.0.0
#addin nuget:?package=PuppeteerSharp.Contrib.Extensions&version=7.0.0Install as a Cake Addin
#tool nuget:?package=PuppeteerSharp.Contrib.Extensions&version=7.0.0Install as a Cake Tool
PuppeteerSharp.Contrib.Extensions is a library with convenient extension methods for writing browser tests with the Puppeteer Sharp API.
IPageQuery:
QuerySelectorWithContentAsyncQuerySelectorAllWithContentAsyncEvaluation:
HasContentAsyncHasTitleAsyncHasUrlAsyncIResponseHasUrlIElementHandleAttributes:
ClassListAsyncClassNameAsyncGetAttributeAsyncHrefAsyncIdAsyncNameAsyncSrcAsyncValueAsyncContent:
InnerHtmlAsyncInnerTextAsyncOuterHtmlAsyncTextContentAsyncEvaluation:
ExistsHasAttributeAsyncHasAttributeValueAsyncHasClassAsyncHasContentAsyncHasFocusAsyncIsCheckedAsyncIsDisabledAsyncIsEmptyAsyncIsEnabledAsyncIsReadOnlyAsyncIsRequiredAsyncIsSelectedAsyncQuery:
QuerySelectorWithContentAsyncQuerySelectorAllWithContentAsyncSample projects are located in the samples folder.
This is an example with NUnit:
using System.Linq;
using System.Threading.Tasks;
using NUnit.Framework;
using PuppeteerSharp.Contrib.Extensions;
namespace PuppeteerSharp.Contrib.Sample
{
public class ExtensionsTests
{
IBrowser Browser { get; set; }
IPage Page { get; set; }
[SetUp]
public async Task SetUp()
{
await new BrowserFetcher().DownloadAsync();
Browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
Page = await Browser.NewPageAsync();
}
[TearDown]
public async Task TearDown()
{
await Browser.CloseAsync();
}
[Test]
public async Task Query()
{
await Page.SetContentAsync(@"
<html>
<div id='foo'>Foo</div>
<div id='bar'>Bar</div>
<div id='baz'>Baz</div>
</html>");
var html = await Page.QuerySelectorAsync("html");
var div = await Page.QuerySelectorWithContentAsync("div", "Ba.");
Assert.That(await div.IdAsync(), Is.EqualTo("bar"));
div = await html.QuerySelectorWithContentAsync("div", "Ba.");
Assert.That(await div.IdAsync(), Is.EqualTo("bar"));
var divs = await Page.QuerySelectorAllWithContentAsync("div", "Ba.");
Assert.That(await Task.WhenAll(divs.Select(x => x.IdAsync())), Is.EqualTo(new[] { "bar", "baz" }));
divs = await html.QuerySelectorAllWithContentAsync("div", "Ba.");
Assert.That(await Task.WhenAll(divs.Select(x => x.IdAsync())), Is.EqualTo(new[] { "bar", "baz" }));
}
[Test]
public async Task Attributes()
{
await Page.SetContentAsync(@"
<html>
<form method='post'>
Name: <input type='text' name='name' id='name' required>
Email: <input type='email' name='email' id='email' required>
<input type='submit' value='Subscribe!'>
</form>
<img src='unsubscribe.png' />
<a href='/unsubscribe/'>Unsubscribe</a>
</html>");
var form = await Page.QuerySelectorAsync("form");
Assert.That(await form.GetAttributeAsync("method"), Is.EqualTo("post"));
var input = await Page.QuerySelectorAsync("#name");
Assert.That(await input.HasAttributeAsync("required"));
var link = await Page.QuerySelectorAsync("a");
Assert.That(await link.HrefAsync(), Is.EqualTo("/unsubscribe/"));
input = await Page.QuerySelectorAsync("input[type=email]");
Assert.That(await input.IdAsync(), Is.EqualTo("email"));
input = await Page.QuerySelectorAsync("#email");
Assert.That(await input.NameAsync(), Is.EqualTo("email"));
var img = await Page.QuerySelectorAsync("img");
Assert.That(await img.SrcAsync(), Is.EqualTo("unsubscribe.png"));
input = await Page.QuerySelectorAsync("input[type=submit]");
Assert.That(await input.ValueAsync(), Is.EqualTo("Subscribe!"));
}
[Test]
public async Task Class()
{
await Page.SetContentAsync("<div class='foo bar' />");
var div = await Page.QuerySelectorAsync("div");
Assert.That(await div.ClassNameAsync(), Is.EqualTo("foo bar"));
Assert.That(await div.ClassListAsync(), Is.EqualTo(new[] { "foo", "bar" }));
Assert.That(await div.HasClassAsync("bar"));
}
[Test]
public async Task Content()
{
await Page.SetContentAsync(@"
<html>
<div>
Foo
<span>Bar</span>
</div>
</html>
");
var html = await Page.QuerySelectorAsync("html");
Assert.That(await html.HasContentAsync("Foo"));
var div = await Page.QuerySelectorAsync("div");
Assert.That(await div.InnerHtmlAsync(), Is.EqualTo("\n Foo\n <span>Bar</span>\n "));
Assert.That(await div.OuterHtmlAsync(), Is.EqualTo("<div>\n Foo\n <span>Bar</span>\n </div>"));
Assert.That(await div.InnerTextAsync(), Is.EqualTo("Foo Bar"));
Assert.That(await div.TextContentAsync(), Is.EqualTo("\n Foo\n Bar\n "));
}
[Test]
public async Task Existentiality()
{
await Page.SetContentAsync("<div>Foo</div>");
var div = await Page.QuerySelectorAsync("div");
Assert.That(div.Exists());
}
[Test]
public async Task Input()
{
await Page.SetContentAsync(@"
<form>
<input type='text' autofocus required>
<input type='radio' readonly>
<input type='checkbox' checked>
<select>
<option id='foo'>Foo</option>
<option id='bar'>Bar</option>
</select>
</form>
");
var input = await Page.QuerySelectorAsync("input[type=text]");
Assert.That(await input.HasFocusAsync());
Assert.That(await input.IsRequiredAsync());
input = await Page.QuerySelectorAsync("input[type=radio]");
Assert.That(await input.IsDisabledAsync(), Is.False);
Assert.That(await input.IsEnabledAsync());
Assert.That(await input.IsReadOnlyAsync());
input = await Page.QuerySelectorAsync("input[type=checkbox]");
Assert.That(await input.IsCheckedAsync());
input = await Page.QuerySelectorAsync("#foo");
Assert.That(await input.IsSelectedAsync());
}
}
}
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 was computed. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 was computed. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
Showing the top 5 NuGet packages that depend on PuppeteerSharp.Contrib.Extensions:
| Package | Downloads |
|---|---|
|
PuppeteerSharp.Contrib.Should
Contributions to the Headless Chrome .NET API ๐๐งช โ๏ธ PuppeteerSharp.Contrib.Should is a should assertion library for the Puppeteer Sharp API. โ๏ธ It provides a convenient way to write readable and robust browser tests in .NET ๐ https://hlaueriksson.me/PuppeteerSharp.Contrib.Should/ |
|
|
Rosie.Quality
Package Description |
|
|
E13.Common.Nunit.Api
Common package containing helpers for an Nunit based testing project targeting an Api layer |
|
|
E13.Common.Nunit.UI
Common package containing helpers for an Nunit based testing project for a front end |
|
|
PuppeteerSharp.Contrib.Extensions.Unsafe
Contributions to the Headless Chrome .NET API ๐๐งช โ๏ธ PuppeteerSharp.Contrib.Extensions.Unsafe is a library with extension methods for writing tests with the Puppeteer Sharp API. โ๏ธ It provides a convenient way to write readable and robust browser tests in .NET ๐ https://hlaueriksson.me/PuppeteerSharp.Contrib.Extensions.Unsafe/ โ ๏ธ These extension methods are the sync over async versions of the originals from the PuppeteerSharp.Contrib.Extensions package. They may be convenient, but can be considered unsafe since you run the risk of a deadlock. โ๏ธ Works with: โผ๏ธ Machine.Specifications โผ๏ธ SpecFlow.xUnit โผ๏ธ xunit |
Showing the top 1 popular GitHub repositories that depend on PuppeteerSharp.Contrib.Extensions:
| Repository | Stars |
|---|---|
|
IvanJosipovic/BlazorTable
Blazor Table Component with Sorting, Paging and Filtering
|
๐ฏ Change TargetFramework to net8.0
โฌ๏ธ Bump PuppeteerSharp to 20.0.0
Remove extensions for IElementHandle:
โผ๏ธ IsHiddenAsync
โผ๏ธ IsVisibleAsync