FluffySpoon.Automation.Web.Puppeteer 1.112.0

Prefix Reserved
dotnet add package FluffySpoon.Automation.Web.Puppeteer --version 1.112.0                
NuGet\Install-Package FluffySpoon.Automation.Web.Puppeteer -Version 1.112.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FluffySpoon.Automation.Web.Puppeteer" Version="1.112.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add FluffySpoon.Automation.Web.Puppeteer --version 1.112.0                
#r "nuget: FluffySpoon.Automation.Web.Puppeteer, 1.112.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install FluffySpoon.Automation.Web.Puppeteer as a Cake Addin
#addin nuget:?package=FluffySpoon.Automation.Web.Puppeteer&version=1.112.0

// Install FluffySpoon.Automation.Web.Puppeteer as a Cake Tool
#tool nuget:?package=FluffySpoon.Automation.Web.Puppeteer&version=1.112.0                

Yet another Selenium/Puppeteer framework

But done right this time. Contributions are welcome.

Example

The following test searches for something in Google and asserts that the results are present in both Chrome, Edge and Firefox on Selenium, and Chromium on Puppeteer. All browsers execute their actions in parallel.

var serviceCollection = new ServiceCollection();
serviceCollection.AddJQueryDomSelector();

//use 3 different browsers via Selenium
serviceCollection.AddSeleniumWebAutomationFrameworkInstance(GetEdgeDriver);
serviceCollection.AddSeleniumWebAutomationFrameworkInstance(GetFirefoxDriver);
serviceCollection.AddSeleniumWebAutomationFrameworkInstance(GetChromeDriver);

//also use Chromium via Puppeteer
serviceCollection.AddPuppeteerWebAutomationFrameworkInstance(GetPuppeteerDriverAsync);

var serviceProvider = serviceCollection.BuildServiceProvider();

using (var automationEngine = serviceProvider.GetRequiredService<IWebAutomationEngine>())
{
	await automationEngine.InitializeAsync();

	await automationEngine
		.Open("https://google.com");
					
	await automationEngine
		.Enter("this is a very long test that works").In("input[type=text]:visible")
		.Wait(until => 
			until.Exists("input[type=submit]:visible"));

	var elements = await automationEngine
		.Click.On("input[type=submit]:visible:first")
		.Wait(until => 
			until.Exists("#rso .g:visible"))
		.Expect
		.Count(10).Of("#rso .g:visible");

	Console.WriteLine("Test done!");
}

Selectors

A selector determines how to select elements. Right now, only jQuery selectors are supported.

Css

install-package FluffySpoon.Automation.Css
serviceCollection.AddJQueryDomSelector();

jQuery

install-package FluffySpoon.Automation.JQuery
serviceCollection.AddCssDomSelector();

Automation frameworks

An automation framework decides how the automation is done. Can use either Selenium or Puppeteer currently.

Selenium

install-package FluffySpoon.Automation.Selenium

Puppeteer

install-package FluffySpoon.Automation.Puppeteer

Features

Opening a URL

await automationEngine.Open("https://example.com");

Taking a screenshot

await automationEngine
	.TakeScreenshot
	.Of("selector")
	.SaveAs((engine, i) => 
		engine.UserAgentName + "_" + i + ".jpg");

Mouse operations

Single clicking

var elementsClicked = await automationEngine.Click.On("selector");

Double clicking

var elementsClicked = await automationEngine.DoubleClick.On("selector");

Right clicking

var elementsClicked = await automationEngine.RightClick.On("selector");

Hovering an element

var elementsHovered = await automationEngine.Hover.On("selector");

Dragging & dropping

var elementsDragged = await automationEngine.Drag.From("selector").To("selector");

Typing in elements

var elementsTypedIn = await automationEngine.Enter("some text").In("selector");

Finding elements

var elements = await automationEngine.Find("selector");

Focusing an element

Currently only supports a single element.

var elementsFocused = await automationEngine.Focus.On("selector");

Selecting from a select combo-box

Multiple selections

Selecting by texts
await automationEngine.Select.ByTexts("Bar", "Baz", ...).From("selector");
Selecting by indices
await automationEngine.Select.ByIndices(0, 2, ...).From("selector");
Selecting by values
await automationEngine.Select.ByValues("value1", "value2", ...).From("selector");
await automationEngine.Select.ByValues(1337, 1338, ...).From("selector");

Single selection

Selecting by text
await automationEngine.Select.ByText("Bar").From("selector");
Selecting by index
await automationEngine.Select.ByIndex(0).From("selector");
Selecting by value
await automationEngine.Select.ByValue("value").From("selector");
await automationEngine.Select.ByValue(1337).From("selector");

Waiting

await automationEngine.Wait(until => until.???);

All methods that are available on the until object are the same as are available on the Expect object (see "Expectations" below).

Expectations

Any expecation made that is not met, will throw an ExpectationNotMetException. If you want to wait until a specific expectation is met, see "Waiting" above instead.

Specific class on an element

await automationEngine.Expect.Class.Of("selector");

Amount of elements that exist

await automationEngine.Expect.Count(10).Of("selector");

At least one element exists

await automationEngine.Expect.Exists.Of("selector");

Text in element

await automationEngine.Expect.Text("my text").In("selector");

Value of element

await automationEngine.Expect.Value("value").Of("selector");

More?

Open an issue if there's something missing. I want to make this library the best there is! Pull requests are also very welcome.

Performance issues

There is a known bug in .NET Core that will slow down Selenium, which has a workaround described.

If you see performance issues outside .NET Core or what you are seeing is unrelated, please open an issue.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.112.0 854 3/12/2022
1.104.0 930 4/19/2021
1.103.0 759 4/2/2021
1.102.0 605 3/23/2021
1.98.0 488 3/17/2021
1.96.0 378 3/16/2021
1.94.0 714 3/2/2021
1.92.0 543 2/24/2021
1.89.0 7,859 4/15/2020
1.88.0 9,916 3/21/2019
1.87.0 606 3/20/2019
1.84.0 602 3/20/2019
1.82.0 572 3/20/2019
1.81.0 579 3/20/2019
1.78.0 587 3/20/2019
1.72.0 592 3/20/2019
1.71.0 655 3/17/2019
1.70.0 598 3/17/2019
1.69.0 862 3/6/2019
1.68.0 717 3/3/2019
1.63.0 605 3/3/2019
1.61.0 665 2/22/2019
1.60.0 610 2/22/2019
1.58.0 611 2/22/2019
1.57.0 717 2/20/2019
1.56.0 690 2/20/2019
1.52.0 993 2/6/2019
1.51.0 719 2/6/2019
1.50.0 709 2/5/2019