{"id":17255646,"url":"https://github.com/ffmathy/fluffyspoon.automation","last_synced_at":"2025-04-14T05:42:14.273Z","repository":{"id":28281443,"uuid":"116394101","full_name":"ffMathy/FluffySpoon.Automation","owner":"ffMathy","description":"A set of automation tools.","archived":false,"fork":false,"pushed_at":"2025-01-19T07:03:50.000Z","size":21221,"stargazers_count":16,"open_issues_count":15,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-11T14:21:57.423Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ffMathy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2018-01-05T14:37:12.000Z","updated_at":"2025-04-09T10:12:29.000Z","dependencies_parsed_at":"2023-11-02T14:00:23.241Z","dependency_job_id":null,"html_url":"https://github.com/ffMathy/FluffySpoon.Automation","commit_stats":{"total_commits":108,"total_committers":4,"mean_commits":27.0,"dds":0.5185185185185186,"last_synced_commit":"e40aba7c5c64238b8b068e9d19889a494316c023"},"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ffMathy%2FFluffySpoon.Automation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ffMathy%2FFluffySpoon.Automation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ffMathy%2FFluffySpoon.Automation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ffMathy%2FFluffySpoon.Automation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ffMathy","download_url":"https://codeload.github.com/ffMathy/FluffySpoon.Automation/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248830420,"owners_count":21168272,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-15T07:12:15.287Z","updated_at":"2025-04-14T05:42:14.239Z","avatar_url":"https://github.com/ffMathy.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Yet another Selenium/Puppeteer framework\nBut done right this time. Contributions are welcome.\n\n# Example\nThe 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.\n\n```csharp\nvar serviceCollection = new ServiceCollection();\nserviceCollection.AddJQueryDomSelector();\n\n//use 3 different browsers via Selenium\nserviceCollection.AddSeleniumWebAutomationFrameworkInstance(GetEdgeDriver);\nserviceCollection.AddSeleniumWebAutomationFrameworkInstance(GetFirefoxDriver);\nserviceCollection.AddSeleniumWebAutomationFrameworkInstance(GetChromeDriver);\n\n//also use Chromium via Puppeteer\nserviceCollection.AddPuppeteerWebAutomationFrameworkInstance(GetPuppeteerDriverAsync);\n\nvar serviceProvider = serviceCollection.BuildServiceProvider();\n\nusing (var automationEngine = serviceProvider.GetRequiredService\u003cIWebAutomationEngine\u003e())\n{\n\tawait automationEngine.InitializeAsync();\n\n\tawait automationEngine\n\t\t.Open(\"https://google.com\");\n\t\t\t\t\t\n\tawait automationEngine\n\t\t.Enter(\"this is a very long test that works\").In(\"input[type=text]:visible\")\n\t\t.Wait(until =\u003e \n\t\t\tuntil.Exists(\"input[type=submit]:visible\"));\n\n\tvar elements = await automationEngine\n\t\t.Click.On(\"input[type=submit]:visible:first\")\n\t\t.Wait(until =\u003e \n\t\t\tuntil.Exists(\"#rso .g:visible\"))\n\t\t.Expect\n\t\t.Count(10).Of(\"#rso .g:visible\");\n\n\tConsole.WriteLine(\"Test done!\");\n}\n```\n\n# Selectors\nA selector determines how to select elements. Right now, only jQuery selectors are supported.\n\n## Css\n```\ninstall-package FluffySpoon.Automation.Css\n```\n\n```csharp\nserviceCollection.AddJQueryDomSelector();\n```\n\n## jQuery\n```\ninstall-package FluffySpoon.Automation.JQuery\n```\n\n```csharp\nserviceCollection.AddCssDomSelector();\n```\n\n# Automation frameworks\nAn automation framework decides how the automation is done. Can use either Selenium or Puppeteer currently.\n\n## Selenium\n```\ninstall-package FluffySpoon.Automation.Selenium\n```\n\n## Puppeteer\n```\ninstall-package FluffySpoon.Automation.Puppeteer\n```\n\n# Features\n\n## Opening a URL\n```csharp\nawait automationEngine.Open(\"https://example.com\");\n```\n\n## Taking a screenshot\n```csharp\nawait automationEngine\n\t.TakeScreenshot\n\t.Of(\"selector\")\n\t.SaveAs((engine, i) =\u003e \n\t\tengine.UserAgentName + \"_\" + i + \".jpg\");\n```\n\n## Mouse operations\n\n### Single clicking\n```csharp\nvar elementsClicked = await automationEngine.Click.On(\"selector\");\n```\n\n### Double clicking\n```csharp\nvar elementsClicked = await automationEngine.DoubleClick.On(\"selector\");\n```\n\n### Right clicking\n```csharp\nvar elementsClicked = await automationEngine.RightClick.On(\"selector\");\n```\n\n### Hovering an element\n```csharp\nvar elementsHovered = await automationEngine.Hover.On(\"selector\");\n```\n\n## Dragging \u0026 dropping\n```csharp\nvar elementsDragged = await automationEngine.Drag.From(\"selector\").To(\"selector\");\n```\n\n## Typing in elements\n```csharp\nvar elementsTypedIn = await automationEngine.Enter(\"some text\").In(\"selector\");\n```\n\n## Finding elements\n```csharp\nvar elements = await automationEngine.Find(\"selector\");\n```\n\n## Focusing an element\n*Currently only supports a single element.*\n\n```csharp\nvar elementsFocused = await automationEngine.Focus.On(\"selector\");\n```\n\n## Selecting from a `select` combo-box\n\n### Multiple selections\n\n#### Selecting by texts\n```csharp\nawait automationEngine.Select.ByTexts(\"Bar\", \"Baz\", ...).From(\"selector\");\n```\n\n#### Selecting by indices\n```csharp\nawait automationEngine.Select.ByIndices(0, 2, ...).From(\"selector\");\n```\n\n#### Selecting by values\n```csharp\nawait automationEngine.Select.ByValues(\"value1\", \"value2\", ...).From(\"selector\");\n```\n\n```csharp\nawait automationEngine.Select.ByValues(1337, 1338, ...).From(\"selector\");\n```\n\n### Single selection\n\n#### Selecting by text\n```csharp\nawait automationEngine.Select.ByText(\"Bar\").From(\"selector\");\n```\n\n#### Selecting by index\n```csharp\nawait automationEngine.Select.ByIndex(0).From(\"selector\");\n```\n\n#### Selecting by value\n```csharp\nawait automationEngine.Select.ByValue(\"value\").From(\"selector\");\n```\n\n```csharp\nawait automationEngine.Select.ByValue(1337).From(\"selector\");\n```\n\n## Waiting\n```csharp\nawait automationEngine.Wait(until =\u003e until.???);\n```\n\n_All methods that are available on the `until` object are the same as are available on the `Expect` object (see \"Expectations\" below)._\n\n## Expectations\nAny 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.\n\n### Specific class on an element\n```csharp\nawait automationEngine.Expect.Class.Of(\"selector\");\n```\n\n### Amount of elements that exist\n```csharp\nawait automationEngine.Expect.Count(10).Of(\"selector\");\n```\n\n### At least one element exists\n```csharp\nawait automationEngine.Expect.Exists.Of(\"selector\");\n```\n\n### Text in element\n```csharp\nawait automationEngine.Expect.Text(\"my text\").In(\"selector\");\n```\n\n### Value of element\n```csharp\nawait automationEngine.Expect.Value(\"value\").Of(\"selector\");\n```\n\n## More?\nOpen an issue if there's something missing. I want to make this library the best there is! Pull requests are also very welcome.\n\n# Performance issues\nThere is a [known bug in .NET Core](https://github.com/SeleniumHQ/selenium/issues/6597) that will slow down Selenium, which has a workaround described.\n\nIf you see performance issues outside .NET Core or what you are seeing is unrelated, please open an issue.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fffmathy%2Ffluffyspoon.automation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fffmathy%2Ffluffyspoon.automation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fffmathy%2Ffluffyspoon.automation/lists"}