From cac011533e48feeaebc97186768a7e7309b04b4f Mon Sep 17 00:00:00 2001 From: princebaretto99 Date: Mon, 19 Dec 2022 18:37:17 +0530 Subject: [PATCH 1/8] Initial commit --- .gitignore | 3 + PlaywrightDotnetTests.csproj | 15 ++++ PlaywrightDotnetTests.sln | 25 +++++++ PlaywrightIPhoneTest.cs | 63 ++++++++++++++++ PlaywrightLocalTest.cs | 63 ++++++++++++++++ PlaywrightParallelTest.cs | 139 +++++++++++++++++++++++++++++++++++ PlaywrightPixelTest.cs | 64 ++++++++++++++++ PlaywrightTest.cs | 64 ++++++++++++++++ Program.cs | 39 ++++++++++ README.md | 41 ++++++++++- 10 files changed, 514 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 PlaywrightDotnetTests.csproj create mode 100644 PlaywrightDotnetTests.sln create mode 100644 PlaywrightIPhoneTest.cs create mode 100644 PlaywrightLocalTest.cs create mode 100644 PlaywrightParallelTest.cs create mode 100644 PlaywrightPixelTest.cs create mode 100644 PlaywrightTest.cs create mode 100644 Program.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fb1087d --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +bin +obj +.DS_Store diff --git a/PlaywrightDotnetTests.csproj b/PlaywrightDotnetTests.csproj new file mode 100644 index 0000000..cbd14c2 --- /dev/null +++ b/PlaywrightDotnetTests.csproj @@ -0,0 +1,15 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + diff --git a/PlaywrightDotnetTests.sln b/PlaywrightDotnetTests.sln new file mode 100644 index 0000000..f5b1c1a --- /dev/null +++ b/PlaywrightDotnetTests.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.810.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlaywrightDotnetTests", "PlaywrightDotnetTests.csproj", "{DAF08465-4D94-4B65-AB98-C0965E732F81}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DAF08465-4D94-4B65-AB98-C0965E732F81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DAF08465-4D94-4B65-AB98-C0965E732F81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DAF08465-4D94-4B65-AB98-C0965E732F81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DAF08465-4D94-4B65-AB98-C0965E732F81}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7FAE2CF5-37B9-4938-B8F6-00B4DD9EFE94} + EndGlobalSection +EndGlobal diff --git a/PlaywrightIPhoneTest.cs b/PlaywrightIPhoneTest.cs new file mode 100644 index 0000000..bb91ff8 --- /dev/null +++ b/PlaywrightIPhoneTest.cs @@ -0,0 +1,63 @@ +using Microsoft.Playwright; +using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +class PlaywrightIPhoneTest +{ + public static async Task main(string[] args) + { + using var playwright = await Playwright.CreateAsync(); + + string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); + string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); + + Dictionary browserstackOptions = new Dictionary(); + browserstackOptions.Add("name", "Test on Playwright emulated IPhone 11 Pro"); + browserstackOptions.Add("build", "playwright-dotnet-4"); + browserstackOptions.Add("browser", "playwright-webkit"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); + browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + string capsJson = JsonConvert.SerializeObject(browserstackOptions); + string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); + + await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); + + var context = await browser.NewContextAsync(playwright.Devices["iPhone 11 Pro"]); // Complete list of devices - https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json + + var page = await context.NewPageAsync(); + try + { + page.SetDefaultTimeout(60000); + await page.GotoAsync("https://bstackdemo.com/"); + await page.Locator("#signin").ClickAsync(); + await page.FillAsync("#react-select-2-input", "fav_user"); + await page.PressAsync("#react-select-2-input", "Enter"); + await page.FillAsync("#react-select-3-input", "testingisfun99"); + await page.PressAsync("#react-select-3-input", "Enter"); + await page.Locator(".Button_root__24MxS").ClickAsync(); + var username = await page.Locator(".username").TextContentAsync(); + + if (username == "fav_user") + { + // following line of code is responsible for marking the status of the test on BrowserStack as 'passed'. You can use this code in your after hook after each test + await MarkTestStatus("passed", "Login Done", page); + } + else + { + await MarkTestStatus("failed", "Login Failed", page); + } + } + catch (Exception err) + { + Console.WriteLine(err.Message); + await MarkTestStatus("failed", "Something Failed", page); + } + await browser.CloseAsync(); + } + public static async Task MarkTestStatus(string status, string reason, IPage page) + { + await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); + } +} diff --git a/PlaywrightLocalTest.cs b/PlaywrightLocalTest.cs new file mode 100644 index 0000000..959794f --- /dev/null +++ b/PlaywrightLocalTest.cs @@ -0,0 +1,63 @@ +using Microsoft.Playwright; +using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +class PlaywrightLocalTest +{ + public static async Task main(string[] args) + { + using var playwright = await Playwright.CreateAsync(); + + string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); + string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); + + Dictionary browserstackOptions = new Dictionary(); + browserstackOptions.Add("name", "Playwright local sample test"); + browserstackOptions.Add("build", "playwright-dotnet-3"); + browserstackOptions.Add("os", "osx"); + browserstackOptions.Add("os_version", "catalina"); + browserstackOptions.Add("browser", "chrome"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); + browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + browserstackOptions.Add("browserstack.local", "true"); + string capsJson = JsonConvert.SerializeObject(browserstackOptions); + string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); + + await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); + var page = await browser.NewPageAsync(); + try + { + page.SetDefaultTimeout(60000); + await page.GotoAsync("https://localhost:3000/"); + await page.Locator("#signin").ClickAsync(); + await page.FillAsync("#react-select-2-input", "fav_user"); + await page.PressAsync("#react-select-2-input", "Enter"); + await page.FillAsync("#react-select-3-input", "testingisfun99"); + await page.PressAsync("#react-select-3-input", "Enter"); + await page.Locator(".Button_root__24MxS").ClickAsync(); + var username = await page.Locator(".username").TextContentAsync(); + + if (username == "fav_user") + { + // following line of code is responsible for marking the status of the test on BrowserStack as 'passed'. You can use this code in your after hook after each test + await MarkTestStatus("passed", "Login Done", page); + } + else + { + await MarkTestStatus("failed", "Login Failed", page); + } + } + catch (Exception err) + { + Console.WriteLine(err.Message); + await MarkTestStatus("failed", "Something Failed", page); + } + await browser.CloseAsync(); + } + public static async Task MarkTestStatus(string status, string reason, IPage page) + { + await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); + } +} diff --git a/PlaywrightParallelTest.cs b/PlaywrightParallelTest.cs new file mode 100644 index 0000000..0a4e44d --- /dev/null +++ b/PlaywrightParallelTest.cs @@ -0,0 +1,139 @@ +using Microsoft.Playwright; +using System; +using System.Threading; +using Newtonsoft.Json; +using System.Collections; + +class PlaywrightParallelTest +{ + public static async Task main(string[] args) + { + // The following capability variables contains the set of os/browser environments where you want to run your tests. You can choose to alter this list according to your needs. Read more on https://browserstack.com/docs/automate/playwright/browsers-and-os + try + { + ArrayList capabilitiesList = getCapabilitiesList(); + Task[] taskList = new Task[capabilitiesList.Count]; + + for (int i = 0; i < capabilitiesList.Count; i++) + { + string capsJson; + capsJson = JsonConvert.SerializeObject(capabilitiesList[i]); + var task = Executetestwithcaps(capsJson); + taskList[i] = task; + } + + await Task.WhenAll(taskList); + + } + catch (Exception e) + { + Console.WriteLine(e); + } + } + static ArrayList getCapabilitiesList() + { + ArrayList capabilitiesList = new ArrayList(); + + string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); + string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); + + Dictionary catalinaChromeCap = new Dictionary(); + catalinaChromeCap.Add("browser", "chrome"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + catalinaChromeCap.Add("browser_version", "latest"); + catalinaChromeCap.Add("os", "osx"); + catalinaChromeCap.Add("os_version", "Monterey"); + catalinaChromeCap.Add("name", "Branded Google Chrome on Monterey"); + catalinaChromeCap.Add("build", "playwright-dotnet-2"); + catalinaChromeCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + catalinaChromeCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(catalinaChromeCap); + + Dictionary catalinaEdgeCap = new Dictionary(); + catalinaEdgeCap.Add("browser", "edge"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + catalinaEdgeCap.Add("browser_version", "latest"); + catalinaEdgeCap.Add("os", "osx"); + catalinaEdgeCap.Add("os_version", "Monterey"); + catalinaEdgeCap.Add("name", "Branded Microsoft Edge on Monterey"); + catalinaEdgeCap.Add("build", "playwright-dotnet-2"); + catalinaEdgeCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + catalinaEdgeCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(catalinaEdgeCap); + + Dictionary catalinaFirefoxCap = new Dictionary(); + catalinaFirefoxCap.Add("browser", "playwright-firefox"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + catalinaFirefoxCap.Add("browser_version", "latest"); + catalinaFirefoxCap.Add("os", "osx"); + catalinaFirefoxCap.Add("os_version", "Monterey"); + catalinaFirefoxCap.Add("name", "Playwright firefox on Monterey"); + catalinaFirefoxCap.Add("build", "playwright-dotnet-2"); + catalinaFirefoxCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + catalinaFirefoxCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(catalinaFirefoxCap); + + Dictionary catalinaWebkitCap = new Dictionary(); + catalinaWebkitCap.Add("browser", "playwright-webkit"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit`\ + catalinaWebkitCap.Add("browser_version", "latest"); + catalinaWebkitCap.Add("os", "osx"); + catalinaWebkitCap.Add("os_version", "Monterey"); + catalinaWebkitCap.Add("name", "Playwright webkit on Monterey"); + catalinaWebkitCap.Add("build", "playwright-dotnet-2"); + catalinaWebkitCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + catalinaWebkitCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(catalinaWebkitCap); + + Dictionary catalinaChromiumCap = new Dictionary(); + catalinaChromiumCap.Add("browser", "playwright-chromium"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + catalinaChromiumCap.Add("browser_version", "latest"); + catalinaChromiumCap.Add("os", "osx"); + catalinaChromiumCap.Add("os_version", "Monterey"); + catalinaChromiumCap.Add("name", "Playwright webkit on Monterey"); + catalinaChromiumCap.Add("build", "playwright-dotnet-2"); + catalinaChromiumCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + catalinaChromiumCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(catalinaChromiumCap); + + return capabilitiesList; + } + + //Executetestwithcaps function takes capabilities from 'SampleTestCase' function and executes the test + public static async Task Executetestwithcaps(string capabilities) + { + using var playwright = await Playwright.CreateAsync(); + string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capabilities); + + await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); + var page = await browser.NewPageAsync(); + try + { + page.SetDefaultTimeout(60000); + await page.GotoAsync("https://bstackdemo.com/"); + await page.Locator("#signin").ClickAsync(); + await page.FillAsync("#react-select-2-input", "fav_user"); + await page.PressAsync("#react-select-2-input", "Enter"); + await page.FillAsync("#react-select-3-input", "testingisfun99"); + await page.PressAsync("#react-select-3-input", "Enter"); + await page.Locator(".Button_root__24MxS").ClickAsync(); + var username = await page.Locator(".username").TextContentAsync(); + + if (username == "fav_user") + { + // following line of code is responsible for marking the status of the test on BrowserStack as 'passed'. You can use this code in your after hook after each test + await MarkTestStatus("passed", "Login Done", page); + } + else + { + await MarkTestStatus("failed", "Login Failed", page); + } + } + catch (Exception err) + { + Console.WriteLine(err.Message); + await MarkTestStatus("failed", "Something Failed", page); + } + await browser.CloseAsync(); + } + public static async Task MarkTestStatus(string status, string reason, IPage page) + { + await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); + } +} diff --git a/PlaywrightPixelTest.cs b/PlaywrightPixelTest.cs new file mode 100644 index 0000000..3295d9a --- /dev/null +++ b/PlaywrightPixelTest.cs @@ -0,0 +1,64 @@ +using Microsoft.Playwright; +using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +class PlaywrightPixelTest +{ + public static async Task main(string[] args) + { + using var playwright = await Playwright.CreateAsync(); + + string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); + string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); + + Dictionary browserstackOptions = new Dictionary(); + browserstackOptions.Add("name", "Test on Playwright emulated Pixel 5"); + browserstackOptions.Add("build", "playwright-dotnet-4"); + browserstackOptions.Add("browser", "playwright-webkit"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); + browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + string capsJson = JsonConvert.SerializeObject(browserstackOptions); + string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); + + await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); + + var context = await browser.NewContextAsync(playwright.Devices["Pixel 5"]); // Complete list of devices - https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json + + var page = await context.NewPageAsync(); + try + { + page.SetDefaultTimeout(60000); + await page.GotoAsync("https://bstackdemo.com/"); + await page.Locator("#signin").ClickAsync(); + await page.FillAsync("#react-select-2-input", "fav_user"); + await page.PressAsync("#react-select-2-input", "Enter"); + await page.FillAsync("#react-select-3-input", "testingisfun99"); + await page.PressAsync("#react-select-3-input", "Enter"); + await page.Locator(".Button_root__24MxS").ClickAsync(); + var username = await page.Locator(".username").TextContentAsync(); + + if (username == "fav_user") + { + // following line of code is responsible for marking the status of the test on BrowserStack as 'passed'. You can use this code in your after hook after each test + await MarkTestStatus("passed", "Login Done", page); + } + else + { + await MarkTestStatus("failed", "Login Failed", page); + } + } + catch (Exception err) + { + Console.WriteLine(err.Message); + await MarkTestStatus("failed", "Something Failed", page); + } + await browser.CloseAsync(); + } + + public static async Task MarkTestStatus(string status, string reason, IPage page) + { + await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); + } +} diff --git a/PlaywrightTest.cs b/PlaywrightTest.cs new file mode 100644 index 0000000..a45acdd --- /dev/null +++ b/PlaywrightTest.cs @@ -0,0 +1,64 @@ +using Microsoft.Playwright; +using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +class PlaywrightTest +{ + public static async Task main(string[] args) + { + using var playwright = await Playwright.CreateAsync(); + + string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); + string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); + + Dictionary browserstackOptions = new Dictionary(); + browserstackOptions.Add("name", "Playwright first sample test"); + browserstackOptions.Add("build", "playwright-dotnet-1"); + browserstackOptions.Add("os", "osx"); + browserstackOptions.Add("os_version", "Monterey"); + browserstackOptions.Add("browser", "chrome"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + browserstackOptions.Add("browser_version", "latest"); + browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); + browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + string capsJson = JsonConvert.SerializeObject(browserstackOptions); + string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); + + await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); + var page = await browser.NewPageAsync(); + try + { + page.SetDefaultTimeout(60000); + await page.GotoAsync("https://bstackdemo.com/"); + await page.Locator("#signin").ClickAsync(); + await page.FillAsync("#react-select-2-input", "fav_user"); + await page.PressAsync("#react-select-2-input", "Enter"); + await page.FillAsync("#react-select-3-input", "testingisfun99"); + await page.PressAsync("#react-select-3-input", "Enter"); + await page.Locator(".Button_root__24MxS").ClickAsync(); + var username = await page.Locator(".username").TextContentAsync(); + + if (username == "fav_user") + { + // following line of code is responsible for marking the status of the test on BrowserStack as 'passed'. You can use this code in your after hook after each test + await MarkTestStatus("passed", "Login Done", page); + } + else + { + await MarkTestStatus("failed", "Login Failed", page); + } + } + catch (Exception err) + { + Console.WriteLine(err.Message); + await MarkTestStatus("failed", "Something Failed", page); + } + await browser.CloseAsync(); + } + + public static async Task MarkTestStatus(string status, string reason, IPage page) + { + await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); + } +} diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..7668599 --- /dev/null +++ b/Program.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace PlaywrightTesting +{ + class Program + { + public static async Task Main(string[] args) + { + switch (args[0]) + { + case "single": + Console.WriteLine("Running Single Test"); + await PlaywrightTest.main(args); + break; + case "parallel": + Console.WriteLine("Running Parallel Test"); + await PlaywrightParallelTest.main(args); + break; + case "local": + Console.WriteLine("Running Local Test"); + await PlaywrightLocalTest.main(args); + break; + case "iphonetest": + Console.WriteLine("Running iPhone Test"); + await PlaywrightIPhoneTest.main(args); + break; + case "pixeltest": + Console.WriteLine("Running Pixel Test"); + await PlaywrightPixelTest.main(args); + break; + default: + Console.WriteLine("Running Single Test by default"); + await PlaywrightTest.main(args); + break; + } + } + } +} diff --git a/README.md b/README.md index d381fe3..383d4b1 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,39 @@ -# csharp-playwright-browserstack -Creating a sample repo for different Playwright languages and runners +# Testing with playwright-browserstack in C# + +[Playwright](https://playwright.dev/dotnet/) Integration with BrowserStack. + +![BrowserStack Logo](https://d98b8t1nnulk5.cloudfront.net/production/images/layout/logo-header.png?1469004780) + +## Setup + +* Clone the repo and run `cd playwright-csharp` +* Set `BROWSERSTACK_USERNAME` and `BROWSERSTACK_ACCESS_KEY` as environment variables with your [BrowserStack Username and Access Key](https://www.browserstack.com/accounts/settings) +* Run `dotnet build` + +## Running your tests + +- To run a single test, run `dotnet run single` +- To run a parallel test, run command `dotnet run parallel` +- To run sessions on emulated devices, +`dotnet run iphonetest` or `dotnet run pixeltest` +You can specify any device name from the below list: +https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json + + ### Run sample test on privately hosted websites + + **Using Command-line Interface** + 1. You have to download the BrowserStack Local binary from the links below (depending on your environment): + * [OS X (10.7 and above)](https://www.browserstack.com/browserstack-local/BrowserStackLocal-darwin-x64.zip) + * [Linux 32-bit](https://www.browserstack.com/browserstack-local/BrowserStackLocal-linux-ia32.zip) + * [Linux 64-bit](https://www.browserstack.com/browserstack-local/BrowserStackLocal-linux-x64.zip) + * [Windows (XP and above)](https://www.browserstack.com/browserstack-local/BrowserStackLocal-win32.zip) + 2. Once you have downloaded and unzipped the file, you can initiate the binary by running the command: `./BrowserStackLocal --key YOUR_ACCESS_KEY` + 3. Once you see the terminal say "[SUCCESS]" You can now access your local server(s) in our remote browser”, your local testing connection is considered established. + 4. You can then run the sample Local test using `dotnet run local` + + +## Notes +* You can view your test results on the [BrowserStack Automate dashboard](https://www.browserstack.com/automate) + +## Additional Resources +* [Documentation for writing Automate test scripts with BrowserStack](https://www.browserstack.com/docs/automate/playwright) From 3ae53a44b450b90d6e5d2280adbebfc760842284 Mon Sep 17 00:00:00 2001 From: princebaretto99 Date: Mon, 19 Dec 2022 18:40:24 +0530 Subject: [PATCH 2/8] Updated Readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 383d4b1..a4aac82 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ## Setup -* Clone the repo and run `cd playwright-csharp` +* Clone the repo and run `cd csharp-playwright-browserstack` * Set `BROWSERSTACK_USERNAME` and `BROWSERSTACK_ACCESS_KEY` as environment variables with your [BrowserStack Username and Access Key](https://www.browserstack.com/accounts/settings) * Run `dotnet build` From 3b8f9abf9578bb7a69641806f06b566a5d8ebbf9 Mon Sep 17 00:00:00 2001 From: princebaretto99 Date: Wed, 21 Dec 2022 16:45:34 +0530 Subject: [PATCH 3/8] Changed Test Cases --- .gitignore | 1 + PlaywrightIPhoneTest.cs | 19 +++++++------------ PlaywrightLocalTest.cs | 17 ++++++----------- PlaywrightParallelTest.cs | 17 ++++++----------- PlaywrightPixelTest.cs | 17 ++++++----------- PlaywrightTest.cs | 18 +++++++----------- 6 files changed, 33 insertions(+), 56 deletions(-) diff --git a/.gitignore b/.gitignore index fb1087d..0caa35d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ bin obj .DS_Store +.vs diff --git a/PlaywrightIPhoneTest.cs b/PlaywrightIPhoneTest.cs index bb91ff8..ed094cb 100644 --- a/PlaywrightIPhoneTest.cs +++ b/PlaywrightIPhoneTest.cs @@ -31,22 +31,17 @@ public static async Task main(string[] args) { page.SetDefaultTimeout(60000); await page.GotoAsync("https://bstackdemo.com/"); - await page.Locator("#signin").ClickAsync(); - await page.FillAsync("#react-select-2-input", "fav_user"); - await page.PressAsync("#react-select-2-input", "Enter"); - await page.FillAsync("#react-select-3-input", "testingisfun99"); - await page.PressAsync("#react-select-3-input", "Enter"); - await page.Locator(".Button_root__24MxS").ClickAsync(); - var username = await page.Locator(".username").TextContentAsync(); - - if (username == "fav_user") + await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); + + var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); + + if (text == "iPhone 12") { - // following line of code is responsible for marking the status of the test on BrowserStack as 'passed'. You can use this code in your after hook after each test - await MarkTestStatus("passed", "Login Done", page); + await MarkTestStatus("passed", "Item Added", page); } else { - await MarkTestStatus("failed", "Login Failed", page); + await MarkTestStatus("failed", "Test Failed", page); } } catch (Exception err) diff --git a/PlaywrightLocalTest.cs b/PlaywrightLocalTest.cs index 959794f..3b1e4ab 100644 --- a/PlaywrightLocalTest.cs +++ b/PlaywrightLocalTest.cs @@ -31,22 +31,17 @@ public static async Task main(string[] args) { page.SetDefaultTimeout(60000); await page.GotoAsync("https://localhost:3000/"); - await page.Locator("#signin").ClickAsync(); - await page.FillAsync("#react-select-2-input", "fav_user"); - await page.PressAsync("#react-select-2-input", "Enter"); - await page.FillAsync("#react-select-3-input", "testingisfun99"); - await page.PressAsync("#react-select-3-input", "Enter"); - await page.Locator(".Button_root__24MxS").ClickAsync(); - var username = await page.Locator(".username").TextContentAsync(); + await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); - if (username == "fav_user") + var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); + + if (text == "iPhone 12") { - // following line of code is responsible for marking the status of the test on BrowserStack as 'passed'. You can use this code in your after hook after each test - await MarkTestStatus("passed", "Login Done", page); + await MarkTestStatus("passed", "Item Added", page); } else { - await MarkTestStatus("failed", "Login Failed", page); + await MarkTestStatus("failed", "Test Failed", page); } } catch (Exception err) diff --git a/PlaywrightParallelTest.cs b/PlaywrightParallelTest.cs index 0a4e44d..175dfb4 100644 --- a/PlaywrightParallelTest.cs +++ b/PlaywrightParallelTest.cs @@ -107,22 +107,17 @@ public static async Task Executetestwithcaps(string capabilities) { page.SetDefaultTimeout(60000); await page.GotoAsync("https://bstackdemo.com/"); - await page.Locator("#signin").ClickAsync(); - await page.FillAsync("#react-select-2-input", "fav_user"); - await page.PressAsync("#react-select-2-input", "Enter"); - await page.FillAsync("#react-select-3-input", "testingisfun99"); - await page.PressAsync("#react-select-3-input", "Enter"); - await page.Locator(".Button_root__24MxS").ClickAsync(); - var username = await page.Locator(".username").TextContentAsync(); + await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); - if (username == "fav_user") + var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); + + if (text == "iPhone 12") { - // following line of code is responsible for marking the status of the test on BrowserStack as 'passed'. You can use this code in your after hook after each test - await MarkTestStatus("passed", "Login Done", page); + await MarkTestStatus("passed", "Item Added", page); } else { - await MarkTestStatus("failed", "Login Failed", page); + await MarkTestStatus("failed", "Test Failed", page); } } catch (Exception err) diff --git a/PlaywrightPixelTest.cs b/PlaywrightPixelTest.cs index 3295d9a..ec6c8af 100644 --- a/PlaywrightPixelTest.cs +++ b/PlaywrightPixelTest.cs @@ -31,22 +31,17 @@ public static async Task main(string[] args) { page.SetDefaultTimeout(60000); await page.GotoAsync("https://bstackdemo.com/"); - await page.Locator("#signin").ClickAsync(); - await page.FillAsync("#react-select-2-input", "fav_user"); - await page.PressAsync("#react-select-2-input", "Enter"); - await page.FillAsync("#react-select-3-input", "testingisfun99"); - await page.PressAsync("#react-select-3-input", "Enter"); - await page.Locator(".Button_root__24MxS").ClickAsync(); - var username = await page.Locator(".username").TextContentAsync(); + await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); - if (username == "fav_user") + var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); + + if (text == "iPhone 12") { - // following line of code is responsible for marking the status of the test on BrowserStack as 'passed'. You can use this code in your after hook after each test - await MarkTestStatus("passed", "Login Done", page); + await MarkTestStatus("passed", "Item Added", page); } else { - await MarkTestStatus("failed", "Login Failed", page); + await MarkTestStatus("failed", "Test Failed", page); } } catch (Exception err) diff --git a/PlaywrightTest.cs b/PlaywrightTest.cs index a45acdd..9a73b3a 100644 --- a/PlaywrightTest.cs +++ b/PlaywrightTest.cs @@ -31,22 +31,18 @@ public static async Task main(string[] args) { page.SetDefaultTimeout(60000); await page.GotoAsync("https://bstackdemo.com/"); - await page.Locator("#signin").ClickAsync(); - await page.FillAsync("#react-select-2-input", "fav_user"); - await page.PressAsync("#react-select-2-input", "Enter"); - await page.FillAsync("#react-select-3-input", "testingisfun99"); - await page.PressAsync("#react-select-3-input", "Enter"); - await page.Locator(".Button_root__24MxS").ClickAsync(); - var username = await page.Locator(".username").TextContentAsync(); + + await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); - if (username == "fav_user") + var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); + + if (text == "iPhone 12") { - // following line of code is responsible for marking the status of the test on BrowserStack as 'passed'. You can use this code in your after hook after each test - await MarkTestStatus("passed", "Login Done", page); + await MarkTestStatus("passed", "Item Added", page); } else { - await MarkTestStatus("failed", "Login Failed", page); + await MarkTestStatus("failed", "Test Failed", page); } } catch (Exception err) From 1c3925d3a23dcdcb65e8160a62d8da3b4de51d60 Mon Sep 17 00:00:00 2001 From: princebaretto99 Date: Thu, 19 Jan 2023 19:09:36 +0530 Subject: [PATCH 4/8] Updated to Nunit --- BrowserStackBrowserTest.cs | 60 ++++++++ BrowserStackContextTest.cs | 25 ++++ BrowserStackPageTest.cs | 22 +++ BrowserStackPlaywrightNUnit.csproj | 24 ++++ ...sts.sln => BrowserStackPlaywrightNUnit.sln | 14 +- BrowserStackService.cs | 34 +++++ PlaywrightDotnetTests.csproj | 15 -- PlaywrightIPhoneTest.cs | 58 -------- PlaywrightLocalTest.cs | 58 -------- PlaywrightParallelTest.cs | 134 ------------------ PlaywrightPixelTest.cs | 59 -------- PlaywrightTest.cs | 60 -------- Program.cs | 39 ----- SampleTest1.cs | 32 +++++ SampleTest2.cs | 30 ++++ SampleTest3.cs | 36 +++++ Usings.cs | 1 + 17 files changed, 271 insertions(+), 430 deletions(-) create mode 100644 BrowserStackBrowserTest.cs create mode 100644 BrowserStackContextTest.cs create mode 100644 BrowserStackPageTest.cs create mode 100644 BrowserStackPlaywrightNUnit.csproj rename PlaywrightDotnetTests.sln => BrowserStackPlaywrightNUnit.sln (53%) create mode 100644 BrowserStackService.cs delete mode 100644 PlaywrightDotnetTests.csproj delete mode 100644 PlaywrightIPhoneTest.cs delete mode 100644 PlaywrightLocalTest.cs delete mode 100644 PlaywrightParallelTest.cs delete mode 100644 PlaywrightPixelTest.cs delete mode 100644 PlaywrightTest.cs delete mode 100644 Program.cs create mode 100644 SampleTest1.cs create mode 100644 SampleTest2.cs create mode 100644 SampleTest3.cs create mode 100644 Usings.cs diff --git a/BrowserStackBrowserTest.cs b/BrowserStackBrowserTest.cs new file mode 100644 index 0000000..b373666 --- /dev/null +++ b/BrowserStackBrowserTest.cs @@ -0,0 +1,60 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Playwright; +using Microsoft.Playwright.NUnit; +using NUnit.Framework; + +namespace BrowserStackPlaywrightNUnit +{ + public class BrowserStackBrowserTest : PlaywrightTest + { + public IBrowser Browser { get; internal set; } = null!; + private readonly List _contexts = new(); + + public async Task NewContext(BrowserNewContextOptions? options = null) + { + var context = await Browser.NewContextAsync(options).ConfigureAwait(false); + _contexts.Add(context); + return context; + } + + [SetUp] + public async Task BrowserSetup() + { + var service = await BrowserStackService.Register(this, BrowserType).ConfigureAwait(false); + Console.WriteLine(BrowserName); + Browser = service.Browser; + } + + //onetimeTearDown + [TearDown] + public async Task BrowserTearDown() + { + if (TestOk()) + { + foreach (var context in _contexts) + { + await context.CloseAsync().ConfigureAwait(false); + //await Browser.CloseAsync(); + } + } + _contexts.Clear(); + + //await Browser.CloseAsync(); + Browser = null!; + //await Browser.CloseAsync(); + + } + + //[OneTimeTearDown] + //public async Task BrowserSessionTearDown() + //{ + // Console.WriteLine("OneTimeTearDown process"); + // await Browser.CloseAsync(); + // Browser = null!; + + + //} + } +} + diff --git a/BrowserStackContextTest.cs b/BrowserStackContextTest.cs new file mode 100644 index 0000000..76c4e3a --- /dev/null +++ b/BrowserStackContextTest.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Playwright; +using Microsoft.Playwright.NUnit; +using NUnit.Framework; + +namespace BrowserStackPlaywrightNUnit +{ + public class BrowserStackContextTest : BrowserStackBrowserTest + { + public IBrowserContext Context { get; private set; } = null!; + + public virtual BrowserNewContextOptions ContextOptions() + { + return null!; + } + + [SetUp] + public async Task ContextSetup() + { + Context = await NewContext(ContextOptions()).ConfigureAwait(false); + } + } +} + diff --git a/BrowserStackPageTest.cs b/BrowserStackPageTest.cs new file mode 100644 index 0000000..b5da5dc --- /dev/null +++ b/BrowserStackPageTest.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Playwright; +using Microsoft.Playwright.NUnit; +using NUnit.Framework; + +namespace BrowserStackPlaywrightNUnit +{ + public class BrowserStackPageTest : BrowserStackContextTest + { + public IPage Page { get; private set; } = null!; + + [SetUp] + public async Task PageSetup() + { + Page = await Context.NewPageAsync().ConfigureAwait(false); + } + + } +} + diff --git a/BrowserStackPlaywrightNUnit.csproj b/BrowserStackPlaywrightNUnit.csproj new file mode 100644 index 0000000..ec1ddd8 --- /dev/null +++ b/BrowserStackPlaywrightNUnit.csproj @@ -0,0 +1,24 @@ + + + + net7.0 + enable + enable + + false + + + + + + + + + + + + + + + + diff --git a/PlaywrightDotnetTests.sln b/BrowserStackPlaywrightNUnit.sln similarity index 53% rename from PlaywrightDotnetTests.sln rename to BrowserStackPlaywrightNUnit.sln index f5b1c1a..abffb6a 100644 --- a/PlaywrightDotnetTests.sln +++ b/BrowserStackPlaywrightNUnit.sln @@ -1,9 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 -VisualStudioVersion = 16.0.810.14 +VisualStudioVersion = 25.0.1704.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlaywrightDotnetTests", "PlaywrightDotnetTests.csproj", "{DAF08465-4D94-4B65-AB98-C0965E732F81}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BrowserStackPlaywrightNUnit", "BrowserStackPlaywrightNUnit.csproj", "{ADBF9A88-9180-4DB7-AD25-E9F8822042A3}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -11,15 +11,15 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DAF08465-4D94-4B65-AB98-C0965E732F81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DAF08465-4D94-4B65-AB98-C0965E732F81}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DAF08465-4D94-4B65-AB98-C0965E732F81}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DAF08465-4D94-4B65-AB98-C0965E732F81}.Release|Any CPU.Build.0 = Release|Any CPU + {ADBF9A88-9180-4DB7-AD25-E9F8822042A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ADBF9A88-9180-4DB7-AD25-E9F8822042A3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADBF9A88-9180-4DB7-AD25-E9F8822042A3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ADBF9A88-9180-4DB7-AD25-E9F8822042A3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {7FAE2CF5-37B9-4938-B8F6-00B4DD9EFE94} + SolutionGuid = {B38C8573-9216-4837-8BD1-869ABD09F394} EndGlobalSection EndGlobal diff --git a/BrowserStackService.cs b/BrowserStackService.cs new file mode 100644 index 0000000..41e98b8 --- /dev/null +++ b/BrowserStackService.cs @@ -0,0 +1,34 @@ +using System.Threading.Tasks; +using Microsoft.Playwright; +using Microsoft.Playwright.NUnit; +using Microsoft.Playwright.TestAdapter; +using Newtonsoft.Json; + +internal class BrowserStackService : IWorkerService +{ + public IBrowser Browser { get; internal set; } = null!; + + public static Task Register(WorkerAwareTest test, IBrowserType browserType) + { + Dictionary browserstackOptions = new Dictionary(); + browserstackOptions.Add("name", "Playwright first sample test - 2"); + browserstackOptions.Add("build", "playwright-dotnet-1"); + browserstackOptions.Add("os", "osx"); + browserstackOptions.Add("os_version", "catalina"); + browserstackOptions.Add("browser", "chrome"); + browserstackOptions.Add("browserstack.username", "BROWSERSTACK_USERNAME"); + browserstackOptions.Add("browserstack.accessKey", "BROWSERSTACK_ACCESS_KEY"); + + string capsJson = JsonConvert.SerializeObject(browserstackOptions); + string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); + + + return test.RegisterService("Browser", async () => new BrowserStackService + { + Browser = await browserType.ConnectAsync(cdpUrl).ConfigureAwait(false) + }) ; + } + + public Task ResetAsync() => Task.CompletedTask; + public Task DisposeAsync() => Browser.CloseAsync(); +} diff --git a/PlaywrightDotnetTests.csproj b/PlaywrightDotnetTests.csproj deleted file mode 100644 index cbd14c2..0000000 --- a/PlaywrightDotnetTests.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - Exe - net6.0 - enable - enable - - - - - - - - diff --git a/PlaywrightIPhoneTest.cs b/PlaywrightIPhoneTest.cs deleted file mode 100644 index ed094cb..0000000 --- a/PlaywrightIPhoneTest.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Microsoft.Playwright; -using System.Threading.Tasks; -using System; -using System.Collections.Generic; -using Newtonsoft.Json; - -class PlaywrightIPhoneTest -{ - public static async Task main(string[] args) - { - using var playwright = await Playwright.CreateAsync(); - - string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); - string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); - - Dictionary browserstackOptions = new Dictionary(); - browserstackOptions.Add("name", "Test on Playwright emulated IPhone 11 Pro"); - browserstackOptions.Add("build", "playwright-dotnet-4"); - browserstackOptions.Add("browser", "playwright-webkit"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); - browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - string capsJson = JsonConvert.SerializeObject(browserstackOptions); - string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); - - await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); - - var context = await browser.NewContextAsync(playwright.Devices["iPhone 11 Pro"]); // Complete list of devices - https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json - - var page = await context.NewPageAsync(); - try - { - page.SetDefaultTimeout(60000); - await page.GotoAsync("https://bstackdemo.com/"); - await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); - - var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); - - if (text == "iPhone 12") - { - await MarkTestStatus("passed", "Item Added", page); - } - else - { - await MarkTestStatus("failed", "Test Failed", page); - } - } - catch (Exception err) - { - Console.WriteLine(err.Message); - await MarkTestStatus("failed", "Something Failed", page); - } - await browser.CloseAsync(); - } - public static async Task MarkTestStatus(string status, string reason, IPage page) - { - await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); - } -} diff --git a/PlaywrightLocalTest.cs b/PlaywrightLocalTest.cs deleted file mode 100644 index 3b1e4ab..0000000 --- a/PlaywrightLocalTest.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Microsoft.Playwright; -using System.Threading.Tasks; -using System; -using System.Collections.Generic; -using Newtonsoft.Json; - -class PlaywrightLocalTest -{ - public static async Task main(string[] args) - { - using var playwright = await Playwright.CreateAsync(); - - string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); - string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); - - Dictionary browserstackOptions = new Dictionary(); - browserstackOptions.Add("name", "Playwright local sample test"); - browserstackOptions.Add("build", "playwright-dotnet-3"); - browserstackOptions.Add("os", "osx"); - browserstackOptions.Add("os_version", "catalina"); - browserstackOptions.Add("browser", "chrome"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); - browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - browserstackOptions.Add("browserstack.local", "true"); - string capsJson = JsonConvert.SerializeObject(browserstackOptions); - string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); - - await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); - var page = await browser.NewPageAsync(); - try - { - page.SetDefaultTimeout(60000); - await page.GotoAsync("https://localhost:3000/"); - await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); - - var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); - - if (text == "iPhone 12") - { - await MarkTestStatus("passed", "Item Added", page); - } - else - { - await MarkTestStatus("failed", "Test Failed", page); - } - } - catch (Exception err) - { - Console.WriteLine(err.Message); - await MarkTestStatus("failed", "Something Failed", page); - } - await browser.CloseAsync(); - } - public static async Task MarkTestStatus(string status, string reason, IPage page) - { - await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); - } -} diff --git a/PlaywrightParallelTest.cs b/PlaywrightParallelTest.cs deleted file mode 100644 index 175dfb4..0000000 --- a/PlaywrightParallelTest.cs +++ /dev/null @@ -1,134 +0,0 @@ -using Microsoft.Playwright; -using System; -using System.Threading; -using Newtonsoft.Json; -using System.Collections; - -class PlaywrightParallelTest -{ - public static async Task main(string[] args) - { - // The following capability variables contains the set of os/browser environments where you want to run your tests. You can choose to alter this list according to your needs. Read more on https://browserstack.com/docs/automate/playwright/browsers-and-os - try - { - ArrayList capabilitiesList = getCapabilitiesList(); - Task[] taskList = new Task[capabilitiesList.Count]; - - for (int i = 0; i < capabilitiesList.Count; i++) - { - string capsJson; - capsJson = JsonConvert.SerializeObject(capabilitiesList[i]); - var task = Executetestwithcaps(capsJson); - taskList[i] = task; - } - - await Task.WhenAll(taskList); - - } - catch (Exception e) - { - Console.WriteLine(e); - } - } - static ArrayList getCapabilitiesList() - { - ArrayList capabilitiesList = new ArrayList(); - - string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); - string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); - - Dictionary catalinaChromeCap = new Dictionary(); - catalinaChromeCap.Add("browser", "chrome"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - catalinaChromeCap.Add("browser_version", "latest"); - catalinaChromeCap.Add("os", "osx"); - catalinaChromeCap.Add("os_version", "Monterey"); - catalinaChromeCap.Add("name", "Branded Google Chrome on Monterey"); - catalinaChromeCap.Add("build", "playwright-dotnet-2"); - catalinaChromeCap.Add("browserstack.username", BROWSERSTACK_USERNAME); - catalinaChromeCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - capabilitiesList.Add(catalinaChromeCap); - - Dictionary catalinaEdgeCap = new Dictionary(); - catalinaEdgeCap.Add("browser", "edge"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - catalinaEdgeCap.Add("browser_version", "latest"); - catalinaEdgeCap.Add("os", "osx"); - catalinaEdgeCap.Add("os_version", "Monterey"); - catalinaEdgeCap.Add("name", "Branded Microsoft Edge on Monterey"); - catalinaEdgeCap.Add("build", "playwright-dotnet-2"); - catalinaEdgeCap.Add("browserstack.username", BROWSERSTACK_USERNAME); - catalinaEdgeCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - capabilitiesList.Add(catalinaEdgeCap); - - Dictionary catalinaFirefoxCap = new Dictionary(); - catalinaFirefoxCap.Add("browser", "playwright-firefox"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - catalinaFirefoxCap.Add("browser_version", "latest"); - catalinaFirefoxCap.Add("os", "osx"); - catalinaFirefoxCap.Add("os_version", "Monterey"); - catalinaFirefoxCap.Add("name", "Playwright firefox on Monterey"); - catalinaFirefoxCap.Add("build", "playwright-dotnet-2"); - catalinaFirefoxCap.Add("browserstack.username", BROWSERSTACK_USERNAME); - catalinaFirefoxCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - capabilitiesList.Add(catalinaFirefoxCap); - - Dictionary catalinaWebkitCap = new Dictionary(); - catalinaWebkitCap.Add("browser", "playwright-webkit"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit`\ - catalinaWebkitCap.Add("browser_version", "latest"); - catalinaWebkitCap.Add("os", "osx"); - catalinaWebkitCap.Add("os_version", "Monterey"); - catalinaWebkitCap.Add("name", "Playwright webkit on Monterey"); - catalinaWebkitCap.Add("build", "playwright-dotnet-2"); - catalinaWebkitCap.Add("browserstack.username", BROWSERSTACK_USERNAME); - catalinaWebkitCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - capabilitiesList.Add(catalinaWebkitCap); - - Dictionary catalinaChromiumCap = new Dictionary(); - catalinaChromiumCap.Add("browser", "playwright-chromium"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - catalinaChromiumCap.Add("browser_version", "latest"); - catalinaChromiumCap.Add("os", "osx"); - catalinaChromiumCap.Add("os_version", "Monterey"); - catalinaChromiumCap.Add("name", "Playwright webkit on Monterey"); - catalinaChromiumCap.Add("build", "playwright-dotnet-2"); - catalinaChromiumCap.Add("browserstack.username", BROWSERSTACK_USERNAME); - catalinaChromiumCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - capabilitiesList.Add(catalinaChromiumCap); - - return capabilitiesList; - } - - //Executetestwithcaps function takes capabilities from 'SampleTestCase' function and executes the test - public static async Task Executetestwithcaps(string capabilities) - { - using var playwright = await Playwright.CreateAsync(); - string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capabilities); - - await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); - var page = await browser.NewPageAsync(); - try - { - page.SetDefaultTimeout(60000); - await page.GotoAsync("https://bstackdemo.com/"); - await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); - - var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); - - if (text == "iPhone 12") - { - await MarkTestStatus("passed", "Item Added", page); - } - else - { - await MarkTestStatus("failed", "Test Failed", page); - } - } - catch (Exception err) - { - Console.WriteLine(err.Message); - await MarkTestStatus("failed", "Something Failed", page); - } - await browser.CloseAsync(); - } - public static async Task MarkTestStatus(string status, string reason, IPage page) - { - await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); - } -} diff --git a/PlaywrightPixelTest.cs b/PlaywrightPixelTest.cs deleted file mode 100644 index ec6c8af..0000000 --- a/PlaywrightPixelTest.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Microsoft.Playwright; -using System.Threading.Tasks; -using System; -using System.Collections.Generic; -using Newtonsoft.Json; - -class PlaywrightPixelTest -{ - public static async Task main(string[] args) - { - using var playwright = await Playwright.CreateAsync(); - - string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); - string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); - - Dictionary browserstackOptions = new Dictionary(); - browserstackOptions.Add("name", "Test on Playwright emulated Pixel 5"); - browserstackOptions.Add("build", "playwright-dotnet-4"); - browserstackOptions.Add("browser", "playwright-webkit"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); - browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - string capsJson = JsonConvert.SerializeObject(browserstackOptions); - string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); - - await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); - - var context = await browser.NewContextAsync(playwright.Devices["Pixel 5"]); // Complete list of devices - https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json - - var page = await context.NewPageAsync(); - try - { - page.SetDefaultTimeout(60000); - await page.GotoAsync("https://bstackdemo.com/"); - await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); - - var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); - - if (text == "iPhone 12") - { - await MarkTestStatus("passed", "Item Added", page); - } - else - { - await MarkTestStatus("failed", "Test Failed", page); - } - } - catch (Exception err) - { - Console.WriteLine(err.Message); - await MarkTestStatus("failed", "Something Failed", page); - } - await browser.CloseAsync(); - } - - public static async Task MarkTestStatus(string status, string reason, IPage page) - { - await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); - } -} diff --git a/PlaywrightTest.cs b/PlaywrightTest.cs deleted file mode 100644 index 9a73b3a..0000000 --- a/PlaywrightTest.cs +++ /dev/null @@ -1,60 +0,0 @@ -using Microsoft.Playwright; -using System.Threading.Tasks; -using System; -using System.Collections.Generic; -using Newtonsoft.Json; - -class PlaywrightTest -{ - public static async Task main(string[] args) - { - using var playwright = await Playwright.CreateAsync(); - - string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); - string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); - - Dictionary browserstackOptions = new Dictionary(); - browserstackOptions.Add("name", "Playwright first sample test"); - browserstackOptions.Add("build", "playwright-dotnet-1"); - browserstackOptions.Add("os", "osx"); - browserstackOptions.Add("os_version", "Monterey"); - browserstackOptions.Add("browser", "chrome"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - browserstackOptions.Add("browser_version", "latest"); - browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); - browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - string capsJson = JsonConvert.SerializeObject(browserstackOptions); - string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); - - await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); - var page = await browser.NewPageAsync(); - try - { - page.SetDefaultTimeout(60000); - await page.GotoAsync("https://bstackdemo.com/"); - - await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); - - var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); - - if (text == "iPhone 12") - { - await MarkTestStatus("passed", "Item Added", page); - } - else - { - await MarkTestStatus("failed", "Test Failed", page); - } - } - catch (Exception err) - { - Console.WriteLine(err.Message); - await MarkTestStatus("failed", "Something Failed", page); - } - await browser.CloseAsync(); - } - - public static async Task MarkTestStatus(string status, string reason, IPage page) - { - await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); - } -} diff --git a/Program.cs b/Program.cs deleted file mode 100644 index 7668599..0000000 --- a/Program.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PlaywrightTesting -{ - class Program - { - public static async Task Main(string[] args) - { - switch (args[0]) - { - case "single": - Console.WriteLine("Running Single Test"); - await PlaywrightTest.main(args); - break; - case "parallel": - Console.WriteLine("Running Parallel Test"); - await PlaywrightParallelTest.main(args); - break; - case "local": - Console.WriteLine("Running Local Test"); - await PlaywrightLocalTest.main(args); - break; - case "iphonetest": - Console.WriteLine("Running iPhone Test"); - await PlaywrightIPhoneTest.main(args); - break; - case "pixeltest": - Console.WriteLine("Running Pixel Test"); - await PlaywrightPixelTest.main(args); - break; - default: - Console.WriteLine("Running Single Test by default"); - await PlaywrightTest.main(args); - break; - } - } - } -} diff --git a/SampleTest1.cs b/SampleTest1.cs new file mode 100644 index 0000000..5d710da --- /dev/null +++ b/SampleTest1.cs @@ -0,0 +1,32 @@ +using Microsoft.Playwright.NUnit; +using Microsoft.Playwright; +using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace BrowserStackPlaywrightNUnit; + +[Parallelizable(ParallelScope.Self)] +[TestFixture] +public class SampleTest1 : BrowserStackPageTest +{ + + [Test] + public async Task SampleTest1Test1() + { + Page.SetDefaultTimeout(60000); + await Page.GotoAsync("https://playwright.dev"); + await Assertions.Expect(Page.Locator("text=enables reliable end-to-end testing for modern web apps")).ToBeVisibleAsync(); + //Page.EvaluateAsync(() => { "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"\", \"reason\": \" \"}}" }); + } + + [Test] + public async Task SampleTest1Test2() + { + Page.SetDefaultTimeout(60000); + await Page.GotoAsync("https://playwright.dev"); + var title = Page.Locator(".navbar__inner .navbar__title"); + await Assertions.Expect(title).ToHaveTextAsync("Playwright"); + } +} \ No newline at end of file diff --git a/SampleTest2.cs b/SampleTest2.cs new file mode 100644 index 0000000..0acdc3d --- /dev/null +++ b/SampleTest2.cs @@ -0,0 +1,30 @@ +using Microsoft.Playwright.NUnit; +using Microsoft.Playwright; +using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace BrowserStackPlaywrightNUnit; + +[Parallelizable(ParallelScope.Self)] +[TestFixture] +public class SampleTest2 : BrowserStackPageTest +{ + [Test] + public async Task SampleTest2Test1() + { + Page.SetDefaultTimeout(60000); + await Page.GotoAsync("https://playwright.dev"); + await Assertions.Expect(Page.Locator("text=enables reliable end-to-end testing for modern web apps")).ToBeVisibleAsync(); + } + + [Test] + public async Task SampleTest2Test2() + { + Page.SetDefaultTimeout(60000); + await Page.GotoAsync("https://playwright.dev"); + var title = Page.Locator(".navbar__inner .navbar__title"); + await Assertions.Expect(title).ToHaveTextAsync("Playwright"); + } +} \ No newline at end of file diff --git a/SampleTest3.cs b/SampleTest3.cs new file mode 100644 index 0000000..5860e34 --- /dev/null +++ b/SampleTest3.cs @@ -0,0 +1,36 @@ +using Microsoft.Playwright.NUnit; +using Microsoft.Playwright; +using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace BrowserStackPlaywrightNUnit; + +[Parallelizable(ParallelScope.Self)] +[TestFixture] +public class SampleTest3 : BrowserStackPageTest +{ + //[Test] + //public async Task BrowserStackDemo() + //{ + // Page.SetDefaultTimeout(60000); + // await Page.GotoAsync("https://bstackdemo.com/"); + // await Page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); + + // var text = await Page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); + + // //if (text == "iPhone 12") + // Assertions.Equals(text, "iPhone 12"); + // //await Assertions.Expect(Page.Locator("text=enables reliable end-to-end testing for modern web apps")).ToBeVisibleAsync(); + //} + + [Test] + public async Task SampleTest3Test() + { + Page.SetDefaultTimeout(60000); + await Page.GotoAsync("https://playwright.dev"); + var title = Page.Locator(".navbar__inner .navbar__title"); + await Assertions.Expect(title).ToHaveTextAsync("Playwright"); + } +} \ No newline at end of file diff --git a/Usings.cs b/Usings.cs new file mode 100644 index 0000000..cefced4 --- /dev/null +++ b/Usings.cs @@ -0,0 +1 @@ +global using NUnit.Framework; \ No newline at end of file From 2a7b71b6cd45ae9d7cb1db4ccdc8e3fc0ea11025 Mon Sep 17 00:00:00 2001 From: princebaretto99 Date: Thu, 19 Jan 2023 19:12:05 +0530 Subject: [PATCH 5/8] Readme --- README.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a4aac82..93f49ce 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,9 @@ ## Running your tests -- To run a single test, run `dotnet run single` -- To run a parallel test, run command `dotnet run parallel` -- To run sessions on emulated devices, -`dotnet run iphonetest` or `dotnet run pixeltest` -You can specify any device name from the below list: -https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json +- To run a single test, run `dotnet test --filter "SampleTest3"` +- To run a parallel test, run command `dotnet test --filter "SampleTest3|SampleTest2|SampleTest1"` +- To run a parallel test with workers, run command `dotnet test --filter "SampleTest3|SampleTest2|SampleTest1" -- NUnit.NumberOfTestWorkers=2` ### Run sample test on privately hosted websites @@ -29,7 +26,7 @@ https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/s * [Windows (XP and above)](https://www.browserstack.com/browserstack-local/BrowserStackLocal-win32.zip) 2. Once you have downloaded and unzipped the file, you can initiate the binary by running the command: `./BrowserStackLocal --key YOUR_ACCESS_KEY` 3. Once you see the terminal say "[SUCCESS]" You can now access your local server(s) in our remote browser”, your local testing connection is considered established. - 4. You can then run the sample Local test using `dotnet run local` + ## Notes From 5210ca233b9d46d18d502f0c555d82952d365ecf Mon Sep 17 00:00:00 2001 From: princebaretto99 Date: Mon, 20 Feb 2023 17:03:56 +0530 Subject: [PATCH 6/8] Revert "Readme" This reverts commit 2a7b71b6cd45ae9d7cb1db4ccdc8e3fc0ea11025. --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 93f49ce..a4aac82 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,12 @@ ## Running your tests -- To run a single test, run `dotnet test --filter "SampleTest3"` -- To run a parallel test, run command `dotnet test --filter "SampleTest3|SampleTest2|SampleTest1"` -- To run a parallel test with workers, run command `dotnet test --filter "SampleTest3|SampleTest2|SampleTest1" -- NUnit.NumberOfTestWorkers=2` +- To run a single test, run `dotnet run single` +- To run a parallel test, run command `dotnet run parallel` +- To run sessions on emulated devices, +`dotnet run iphonetest` or `dotnet run pixeltest` +You can specify any device name from the below list: +https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json ### Run sample test on privately hosted websites @@ -26,7 +29,7 @@ * [Windows (XP and above)](https://www.browserstack.com/browserstack-local/BrowserStackLocal-win32.zip) 2. Once you have downloaded and unzipped the file, you can initiate the binary by running the command: `./BrowserStackLocal --key YOUR_ACCESS_KEY` 3. Once you see the terminal say "[SUCCESS]" You can now access your local server(s) in our remote browser”, your local testing connection is considered established. - + 4. You can then run the sample Local test using `dotnet run local` ## Notes From 0773b3001e3c1c431e5c5a6790ae73284f451291 Mon Sep 17 00:00:00 2001 From: princebaretto99 Date: Mon, 20 Feb 2023 17:04:42 +0530 Subject: [PATCH 7/8] Revert "Updated to Nunit" This reverts commit 1c3925d3a23dcdcb65e8160a62d8da3b4de51d60. --- BrowserStackBrowserTest.cs | 60 -------- BrowserStackContextTest.cs | 25 ---- BrowserStackPageTest.cs | 22 --- BrowserStackPlaywrightNUnit.csproj | 24 ---- BrowserStackService.cs | 34 ----- PlaywrightDotnetTests.csproj | 15 ++ ...ightNUnit.sln => PlaywrightDotnetTests.sln | 14 +- PlaywrightIPhoneTest.cs | 58 ++++++++ PlaywrightLocalTest.cs | 58 ++++++++ PlaywrightParallelTest.cs | 134 ++++++++++++++++++ PlaywrightPixelTest.cs | 59 ++++++++ PlaywrightTest.cs | 60 ++++++++ Program.cs | 39 +++++ SampleTest1.cs | 32 ----- SampleTest2.cs | 30 ---- SampleTest3.cs | 36 ----- Usings.cs | 1 - 17 files changed, 430 insertions(+), 271 deletions(-) delete mode 100644 BrowserStackBrowserTest.cs delete mode 100644 BrowserStackContextTest.cs delete mode 100644 BrowserStackPageTest.cs delete mode 100644 BrowserStackPlaywrightNUnit.csproj delete mode 100644 BrowserStackService.cs create mode 100644 PlaywrightDotnetTests.csproj rename BrowserStackPlaywrightNUnit.sln => PlaywrightDotnetTests.sln (53%) create mode 100644 PlaywrightIPhoneTest.cs create mode 100644 PlaywrightLocalTest.cs create mode 100644 PlaywrightParallelTest.cs create mode 100644 PlaywrightPixelTest.cs create mode 100644 PlaywrightTest.cs create mode 100644 Program.cs delete mode 100644 SampleTest1.cs delete mode 100644 SampleTest2.cs delete mode 100644 SampleTest3.cs delete mode 100644 Usings.cs diff --git a/BrowserStackBrowserTest.cs b/BrowserStackBrowserTest.cs deleted file mode 100644 index b373666..0000000 --- a/BrowserStackBrowserTest.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.Playwright; -using Microsoft.Playwright.NUnit; -using NUnit.Framework; - -namespace BrowserStackPlaywrightNUnit -{ - public class BrowserStackBrowserTest : PlaywrightTest - { - public IBrowser Browser { get; internal set; } = null!; - private readonly List _contexts = new(); - - public async Task NewContext(BrowserNewContextOptions? options = null) - { - var context = await Browser.NewContextAsync(options).ConfigureAwait(false); - _contexts.Add(context); - return context; - } - - [SetUp] - public async Task BrowserSetup() - { - var service = await BrowserStackService.Register(this, BrowserType).ConfigureAwait(false); - Console.WriteLine(BrowserName); - Browser = service.Browser; - } - - //onetimeTearDown - [TearDown] - public async Task BrowserTearDown() - { - if (TestOk()) - { - foreach (var context in _contexts) - { - await context.CloseAsync().ConfigureAwait(false); - //await Browser.CloseAsync(); - } - } - _contexts.Clear(); - - //await Browser.CloseAsync(); - Browser = null!; - //await Browser.CloseAsync(); - - } - - //[OneTimeTearDown] - //public async Task BrowserSessionTearDown() - //{ - // Console.WriteLine("OneTimeTearDown process"); - // await Browser.CloseAsync(); - // Browser = null!; - - - //} - } -} - diff --git a/BrowserStackContextTest.cs b/BrowserStackContextTest.cs deleted file mode 100644 index 76c4e3a..0000000 --- a/BrowserStackContextTest.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.Playwright; -using Microsoft.Playwright.NUnit; -using NUnit.Framework; - -namespace BrowserStackPlaywrightNUnit -{ - public class BrowserStackContextTest : BrowserStackBrowserTest - { - public IBrowserContext Context { get; private set; } = null!; - - public virtual BrowserNewContextOptions ContextOptions() - { - return null!; - } - - [SetUp] - public async Task ContextSetup() - { - Context = await NewContext(ContextOptions()).ConfigureAwait(false); - } - } -} - diff --git a/BrowserStackPageTest.cs b/BrowserStackPageTest.cs deleted file mode 100644 index b5da5dc..0000000 --- a/BrowserStackPageTest.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.Playwright; -using Microsoft.Playwright.NUnit; -using NUnit.Framework; - -namespace BrowserStackPlaywrightNUnit -{ - public class BrowserStackPageTest : BrowserStackContextTest - { - public IPage Page { get; private set; } = null!; - - [SetUp] - public async Task PageSetup() - { - Page = await Context.NewPageAsync().ConfigureAwait(false); - } - - } -} - diff --git a/BrowserStackPlaywrightNUnit.csproj b/BrowserStackPlaywrightNUnit.csproj deleted file mode 100644 index ec1ddd8..0000000 --- a/BrowserStackPlaywrightNUnit.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - - net7.0 - enable - enable - - false - - - - - - - - - - - - - - - - diff --git a/BrowserStackService.cs b/BrowserStackService.cs deleted file mode 100644 index 41e98b8..0000000 --- a/BrowserStackService.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Threading.Tasks; -using Microsoft.Playwright; -using Microsoft.Playwright.NUnit; -using Microsoft.Playwright.TestAdapter; -using Newtonsoft.Json; - -internal class BrowserStackService : IWorkerService -{ - public IBrowser Browser { get; internal set; } = null!; - - public static Task Register(WorkerAwareTest test, IBrowserType browserType) - { - Dictionary browserstackOptions = new Dictionary(); - browserstackOptions.Add("name", "Playwright first sample test - 2"); - browserstackOptions.Add("build", "playwright-dotnet-1"); - browserstackOptions.Add("os", "osx"); - browserstackOptions.Add("os_version", "catalina"); - browserstackOptions.Add("browser", "chrome"); - browserstackOptions.Add("browserstack.username", "BROWSERSTACK_USERNAME"); - browserstackOptions.Add("browserstack.accessKey", "BROWSERSTACK_ACCESS_KEY"); - - string capsJson = JsonConvert.SerializeObject(browserstackOptions); - string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); - - - return test.RegisterService("Browser", async () => new BrowserStackService - { - Browser = await browserType.ConnectAsync(cdpUrl).ConfigureAwait(false) - }) ; - } - - public Task ResetAsync() => Task.CompletedTask; - public Task DisposeAsync() => Browser.CloseAsync(); -} diff --git a/PlaywrightDotnetTests.csproj b/PlaywrightDotnetTests.csproj new file mode 100644 index 0000000..cbd14c2 --- /dev/null +++ b/PlaywrightDotnetTests.csproj @@ -0,0 +1,15 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + diff --git a/BrowserStackPlaywrightNUnit.sln b/PlaywrightDotnetTests.sln similarity index 53% rename from BrowserStackPlaywrightNUnit.sln rename to PlaywrightDotnetTests.sln index abffb6a..f5b1c1a 100644 --- a/BrowserStackPlaywrightNUnit.sln +++ b/PlaywrightDotnetTests.sln @@ -1,9 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 -VisualStudioVersion = 25.0.1704.0 +VisualStudioVersion = 16.0.810.14 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BrowserStackPlaywrightNUnit", "BrowserStackPlaywrightNUnit.csproj", "{ADBF9A88-9180-4DB7-AD25-E9F8822042A3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlaywrightDotnetTests", "PlaywrightDotnetTests.csproj", "{DAF08465-4D94-4B65-AB98-C0965E732F81}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -11,15 +11,15 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {ADBF9A88-9180-4DB7-AD25-E9F8822042A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ADBF9A88-9180-4DB7-AD25-E9F8822042A3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ADBF9A88-9180-4DB7-AD25-E9F8822042A3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ADBF9A88-9180-4DB7-AD25-E9F8822042A3}.Release|Any CPU.Build.0 = Release|Any CPU + {DAF08465-4D94-4B65-AB98-C0965E732F81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DAF08465-4D94-4B65-AB98-C0965E732F81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DAF08465-4D94-4B65-AB98-C0965E732F81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DAF08465-4D94-4B65-AB98-C0965E732F81}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {B38C8573-9216-4837-8BD1-869ABD09F394} + SolutionGuid = {7FAE2CF5-37B9-4938-B8F6-00B4DD9EFE94} EndGlobalSection EndGlobal diff --git a/PlaywrightIPhoneTest.cs b/PlaywrightIPhoneTest.cs new file mode 100644 index 0000000..ed094cb --- /dev/null +++ b/PlaywrightIPhoneTest.cs @@ -0,0 +1,58 @@ +using Microsoft.Playwright; +using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +class PlaywrightIPhoneTest +{ + public static async Task main(string[] args) + { + using var playwright = await Playwright.CreateAsync(); + + string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); + string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); + + Dictionary browserstackOptions = new Dictionary(); + browserstackOptions.Add("name", "Test on Playwright emulated IPhone 11 Pro"); + browserstackOptions.Add("build", "playwright-dotnet-4"); + browserstackOptions.Add("browser", "playwright-webkit"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); + browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + string capsJson = JsonConvert.SerializeObject(browserstackOptions); + string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); + + await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); + + var context = await browser.NewContextAsync(playwright.Devices["iPhone 11 Pro"]); // Complete list of devices - https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json + + var page = await context.NewPageAsync(); + try + { + page.SetDefaultTimeout(60000); + await page.GotoAsync("https://bstackdemo.com/"); + await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); + + var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); + + if (text == "iPhone 12") + { + await MarkTestStatus("passed", "Item Added", page); + } + else + { + await MarkTestStatus("failed", "Test Failed", page); + } + } + catch (Exception err) + { + Console.WriteLine(err.Message); + await MarkTestStatus("failed", "Something Failed", page); + } + await browser.CloseAsync(); + } + public static async Task MarkTestStatus(string status, string reason, IPage page) + { + await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); + } +} diff --git a/PlaywrightLocalTest.cs b/PlaywrightLocalTest.cs new file mode 100644 index 0000000..3b1e4ab --- /dev/null +++ b/PlaywrightLocalTest.cs @@ -0,0 +1,58 @@ +using Microsoft.Playwright; +using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +class PlaywrightLocalTest +{ + public static async Task main(string[] args) + { + using var playwright = await Playwright.CreateAsync(); + + string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); + string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); + + Dictionary browserstackOptions = new Dictionary(); + browserstackOptions.Add("name", "Playwright local sample test"); + browserstackOptions.Add("build", "playwright-dotnet-3"); + browserstackOptions.Add("os", "osx"); + browserstackOptions.Add("os_version", "catalina"); + browserstackOptions.Add("browser", "chrome"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); + browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + browserstackOptions.Add("browserstack.local", "true"); + string capsJson = JsonConvert.SerializeObject(browserstackOptions); + string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); + + await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); + var page = await browser.NewPageAsync(); + try + { + page.SetDefaultTimeout(60000); + await page.GotoAsync("https://localhost:3000/"); + await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); + + var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); + + if (text == "iPhone 12") + { + await MarkTestStatus("passed", "Item Added", page); + } + else + { + await MarkTestStatus("failed", "Test Failed", page); + } + } + catch (Exception err) + { + Console.WriteLine(err.Message); + await MarkTestStatus("failed", "Something Failed", page); + } + await browser.CloseAsync(); + } + public static async Task MarkTestStatus(string status, string reason, IPage page) + { + await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); + } +} diff --git a/PlaywrightParallelTest.cs b/PlaywrightParallelTest.cs new file mode 100644 index 0000000..175dfb4 --- /dev/null +++ b/PlaywrightParallelTest.cs @@ -0,0 +1,134 @@ +using Microsoft.Playwright; +using System; +using System.Threading; +using Newtonsoft.Json; +using System.Collections; + +class PlaywrightParallelTest +{ + public static async Task main(string[] args) + { + // The following capability variables contains the set of os/browser environments where you want to run your tests. You can choose to alter this list according to your needs. Read more on https://browserstack.com/docs/automate/playwright/browsers-and-os + try + { + ArrayList capabilitiesList = getCapabilitiesList(); + Task[] taskList = new Task[capabilitiesList.Count]; + + for (int i = 0; i < capabilitiesList.Count; i++) + { + string capsJson; + capsJson = JsonConvert.SerializeObject(capabilitiesList[i]); + var task = Executetestwithcaps(capsJson); + taskList[i] = task; + } + + await Task.WhenAll(taskList); + + } + catch (Exception e) + { + Console.WriteLine(e); + } + } + static ArrayList getCapabilitiesList() + { + ArrayList capabilitiesList = new ArrayList(); + + string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); + string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); + + Dictionary catalinaChromeCap = new Dictionary(); + catalinaChromeCap.Add("browser", "chrome"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + catalinaChromeCap.Add("browser_version", "latest"); + catalinaChromeCap.Add("os", "osx"); + catalinaChromeCap.Add("os_version", "Monterey"); + catalinaChromeCap.Add("name", "Branded Google Chrome on Monterey"); + catalinaChromeCap.Add("build", "playwright-dotnet-2"); + catalinaChromeCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + catalinaChromeCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(catalinaChromeCap); + + Dictionary catalinaEdgeCap = new Dictionary(); + catalinaEdgeCap.Add("browser", "edge"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + catalinaEdgeCap.Add("browser_version", "latest"); + catalinaEdgeCap.Add("os", "osx"); + catalinaEdgeCap.Add("os_version", "Monterey"); + catalinaEdgeCap.Add("name", "Branded Microsoft Edge on Monterey"); + catalinaEdgeCap.Add("build", "playwright-dotnet-2"); + catalinaEdgeCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + catalinaEdgeCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(catalinaEdgeCap); + + Dictionary catalinaFirefoxCap = new Dictionary(); + catalinaFirefoxCap.Add("browser", "playwright-firefox"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + catalinaFirefoxCap.Add("browser_version", "latest"); + catalinaFirefoxCap.Add("os", "osx"); + catalinaFirefoxCap.Add("os_version", "Monterey"); + catalinaFirefoxCap.Add("name", "Playwright firefox on Monterey"); + catalinaFirefoxCap.Add("build", "playwright-dotnet-2"); + catalinaFirefoxCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + catalinaFirefoxCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(catalinaFirefoxCap); + + Dictionary catalinaWebkitCap = new Dictionary(); + catalinaWebkitCap.Add("browser", "playwright-webkit"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit`\ + catalinaWebkitCap.Add("browser_version", "latest"); + catalinaWebkitCap.Add("os", "osx"); + catalinaWebkitCap.Add("os_version", "Monterey"); + catalinaWebkitCap.Add("name", "Playwright webkit on Monterey"); + catalinaWebkitCap.Add("build", "playwright-dotnet-2"); + catalinaWebkitCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + catalinaWebkitCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(catalinaWebkitCap); + + Dictionary catalinaChromiumCap = new Dictionary(); + catalinaChromiumCap.Add("browser", "playwright-chromium"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + catalinaChromiumCap.Add("browser_version", "latest"); + catalinaChromiumCap.Add("os", "osx"); + catalinaChromiumCap.Add("os_version", "Monterey"); + catalinaChromiumCap.Add("name", "Playwright webkit on Monterey"); + catalinaChromiumCap.Add("build", "playwright-dotnet-2"); + catalinaChromiumCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + catalinaChromiumCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(catalinaChromiumCap); + + return capabilitiesList; + } + + //Executetestwithcaps function takes capabilities from 'SampleTestCase' function and executes the test + public static async Task Executetestwithcaps(string capabilities) + { + using var playwright = await Playwright.CreateAsync(); + string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capabilities); + + await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); + var page = await browser.NewPageAsync(); + try + { + page.SetDefaultTimeout(60000); + await page.GotoAsync("https://bstackdemo.com/"); + await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); + + var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); + + if (text == "iPhone 12") + { + await MarkTestStatus("passed", "Item Added", page); + } + else + { + await MarkTestStatus("failed", "Test Failed", page); + } + } + catch (Exception err) + { + Console.WriteLine(err.Message); + await MarkTestStatus("failed", "Something Failed", page); + } + await browser.CloseAsync(); + } + public static async Task MarkTestStatus(string status, string reason, IPage page) + { + await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); + } +} diff --git a/PlaywrightPixelTest.cs b/PlaywrightPixelTest.cs new file mode 100644 index 0000000..ec6c8af --- /dev/null +++ b/PlaywrightPixelTest.cs @@ -0,0 +1,59 @@ +using Microsoft.Playwright; +using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +class PlaywrightPixelTest +{ + public static async Task main(string[] args) + { + using var playwright = await Playwright.CreateAsync(); + + string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); + string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); + + Dictionary browserstackOptions = new Dictionary(); + browserstackOptions.Add("name", "Test on Playwright emulated Pixel 5"); + browserstackOptions.Add("build", "playwright-dotnet-4"); + browserstackOptions.Add("browser", "playwright-webkit"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); + browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + string capsJson = JsonConvert.SerializeObject(browserstackOptions); + string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); + + await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); + + var context = await browser.NewContextAsync(playwright.Devices["Pixel 5"]); // Complete list of devices - https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json + + var page = await context.NewPageAsync(); + try + { + page.SetDefaultTimeout(60000); + await page.GotoAsync("https://bstackdemo.com/"); + await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); + + var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); + + if (text == "iPhone 12") + { + await MarkTestStatus("passed", "Item Added", page); + } + else + { + await MarkTestStatus("failed", "Test Failed", page); + } + } + catch (Exception err) + { + Console.WriteLine(err.Message); + await MarkTestStatus("failed", "Something Failed", page); + } + await browser.CloseAsync(); + } + + public static async Task MarkTestStatus(string status, string reason, IPage page) + { + await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); + } +} diff --git a/PlaywrightTest.cs b/PlaywrightTest.cs new file mode 100644 index 0000000..9a73b3a --- /dev/null +++ b/PlaywrightTest.cs @@ -0,0 +1,60 @@ +using Microsoft.Playwright; +using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using Newtonsoft.Json; + +class PlaywrightTest +{ + public static async Task main(string[] args) + { + using var playwright = await Playwright.CreateAsync(); + + string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); + string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); + + Dictionary browserstackOptions = new Dictionary(); + browserstackOptions.Add("name", "Playwright first sample test"); + browserstackOptions.Add("build", "playwright-dotnet-1"); + browserstackOptions.Add("os", "osx"); + browserstackOptions.Add("os_version", "Monterey"); + browserstackOptions.Add("browser", "chrome"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + browserstackOptions.Add("browser_version", "latest"); + browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); + browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + string capsJson = JsonConvert.SerializeObject(browserstackOptions); + string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); + + await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); + var page = await browser.NewPageAsync(); + try + { + page.SetDefaultTimeout(60000); + await page.GotoAsync("https://bstackdemo.com/"); + + await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); + + var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); + + if (text == "iPhone 12") + { + await MarkTestStatus("passed", "Item Added", page); + } + else + { + await MarkTestStatus("failed", "Test Failed", page); + } + } + catch (Exception err) + { + Console.WriteLine(err.Message); + await MarkTestStatus("failed", "Something Failed", page); + } + await browser.CloseAsync(); + } + + public static async Task MarkTestStatus(string status, string reason, IPage page) + { + await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); + } +} diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..7668599 --- /dev/null +++ b/Program.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace PlaywrightTesting +{ + class Program + { + public static async Task Main(string[] args) + { + switch (args[0]) + { + case "single": + Console.WriteLine("Running Single Test"); + await PlaywrightTest.main(args); + break; + case "parallel": + Console.WriteLine("Running Parallel Test"); + await PlaywrightParallelTest.main(args); + break; + case "local": + Console.WriteLine("Running Local Test"); + await PlaywrightLocalTest.main(args); + break; + case "iphonetest": + Console.WriteLine("Running iPhone Test"); + await PlaywrightIPhoneTest.main(args); + break; + case "pixeltest": + Console.WriteLine("Running Pixel Test"); + await PlaywrightPixelTest.main(args); + break; + default: + Console.WriteLine("Running Single Test by default"); + await PlaywrightTest.main(args); + break; + } + } + } +} diff --git a/SampleTest1.cs b/SampleTest1.cs deleted file mode 100644 index 5d710da..0000000 --- a/SampleTest1.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Microsoft.Playwright.NUnit; -using Microsoft.Playwright; -using System.Threading.Tasks; -using System; -using System.Collections.Generic; -using Newtonsoft.Json; - -namespace BrowserStackPlaywrightNUnit; - -[Parallelizable(ParallelScope.Self)] -[TestFixture] -public class SampleTest1 : BrowserStackPageTest -{ - - [Test] - public async Task SampleTest1Test1() - { - Page.SetDefaultTimeout(60000); - await Page.GotoAsync("https://playwright.dev"); - await Assertions.Expect(Page.Locator("text=enables reliable end-to-end testing for modern web apps")).ToBeVisibleAsync(); - //Page.EvaluateAsync(() => { "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"\", \"reason\": \" \"}}" }); - } - - [Test] - public async Task SampleTest1Test2() - { - Page.SetDefaultTimeout(60000); - await Page.GotoAsync("https://playwright.dev"); - var title = Page.Locator(".navbar__inner .navbar__title"); - await Assertions.Expect(title).ToHaveTextAsync("Playwright"); - } -} \ No newline at end of file diff --git a/SampleTest2.cs b/SampleTest2.cs deleted file mode 100644 index 0acdc3d..0000000 --- a/SampleTest2.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Microsoft.Playwright.NUnit; -using Microsoft.Playwright; -using System.Threading.Tasks; -using System; -using System.Collections.Generic; -using Newtonsoft.Json; - -namespace BrowserStackPlaywrightNUnit; - -[Parallelizable(ParallelScope.Self)] -[TestFixture] -public class SampleTest2 : BrowserStackPageTest -{ - [Test] - public async Task SampleTest2Test1() - { - Page.SetDefaultTimeout(60000); - await Page.GotoAsync("https://playwright.dev"); - await Assertions.Expect(Page.Locator("text=enables reliable end-to-end testing for modern web apps")).ToBeVisibleAsync(); - } - - [Test] - public async Task SampleTest2Test2() - { - Page.SetDefaultTimeout(60000); - await Page.GotoAsync("https://playwright.dev"); - var title = Page.Locator(".navbar__inner .navbar__title"); - await Assertions.Expect(title).ToHaveTextAsync("Playwright"); - } -} \ No newline at end of file diff --git a/SampleTest3.cs b/SampleTest3.cs deleted file mode 100644 index 5860e34..0000000 --- a/SampleTest3.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Microsoft.Playwright.NUnit; -using Microsoft.Playwright; -using System.Threading.Tasks; -using System; -using System.Collections.Generic; -using Newtonsoft.Json; - -namespace BrowserStackPlaywrightNUnit; - -[Parallelizable(ParallelScope.Self)] -[TestFixture] -public class SampleTest3 : BrowserStackPageTest -{ - //[Test] - //public async Task BrowserStackDemo() - //{ - // Page.SetDefaultTimeout(60000); - // await Page.GotoAsync("https://bstackdemo.com/"); - // await Page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); - - // var text = await Page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); - - // //if (text == "iPhone 12") - // Assertions.Equals(text, "iPhone 12"); - // //await Assertions.Expect(Page.Locator("text=enables reliable end-to-end testing for modern web apps")).ToBeVisibleAsync(); - //} - - [Test] - public async Task SampleTest3Test() - { - Page.SetDefaultTimeout(60000); - await Page.GotoAsync("https://playwright.dev"); - var title = Page.Locator(".navbar__inner .navbar__title"); - await Assertions.Expect(title).ToHaveTextAsync("Playwright"); - } -} \ No newline at end of file diff --git a/Usings.cs b/Usings.cs deleted file mode 100644 index cefced4..0000000 --- a/Usings.cs +++ /dev/null @@ -1 +0,0 @@ -global using NUnit.Framework; \ No newline at end of file From fad664a23b18a33a8c0f1d6a5da361dcd0a8d859 Mon Sep 17 00:00:00 2001 From: princebaretto99 Date: Tue, 21 Feb 2023 19:02:44 +0530 Subject: [PATCH 8/8] Updated tests --- .gitignore | 2 + PlaywrightDotnetTests.csproj | 4 ++ PlaywrightIPhoneTest.cs | 58 ----------------- PlaywrightLocalTest.cs | 120 +++++++++++++++++++++++++++++++---- PlaywrightParallelTest.cs | 107 ++++++++++++++++--------------- PlaywrightPixelTest.cs | 59 ----------------- PlaywrightTest.cs | 60 ------------------ Program.cs | 14 +--- README.md | 34 +++++----- 9 files changed, 184 insertions(+), 274 deletions(-) delete mode 100644 PlaywrightIPhoneTest.cs delete mode 100644 PlaywrightPixelTest.cs delete mode 100644 PlaywrightTest.cs diff --git a/.gitignore b/.gitignore index 0caa35d..386c5c1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ bin obj .DS_Store .vs +local.log +BrowserStackLocal.exe diff --git a/PlaywrightDotnetTests.csproj b/PlaywrightDotnetTests.csproj index cbd14c2..2aa95a6 100644 --- a/PlaywrightDotnetTests.csproj +++ b/PlaywrightDotnetTests.csproj @@ -10,6 +10,10 @@ + + + + diff --git a/PlaywrightIPhoneTest.cs b/PlaywrightIPhoneTest.cs deleted file mode 100644 index ed094cb..0000000 --- a/PlaywrightIPhoneTest.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Microsoft.Playwright; -using System.Threading.Tasks; -using System; -using System.Collections.Generic; -using Newtonsoft.Json; - -class PlaywrightIPhoneTest -{ - public static async Task main(string[] args) - { - using var playwright = await Playwright.CreateAsync(); - - string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); - string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); - - Dictionary browserstackOptions = new Dictionary(); - browserstackOptions.Add("name", "Test on Playwright emulated IPhone 11 Pro"); - browserstackOptions.Add("build", "playwright-dotnet-4"); - browserstackOptions.Add("browser", "playwright-webkit"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); - browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - string capsJson = JsonConvert.SerializeObject(browserstackOptions); - string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); - - await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); - - var context = await browser.NewContextAsync(playwright.Devices["iPhone 11 Pro"]); // Complete list of devices - https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json - - var page = await context.NewPageAsync(); - try - { - page.SetDefaultTimeout(60000); - await page.GotoAsync("https://bstackdemo.com/"); - await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); - - var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); - - if (text == "iPhone 12") - { - await MarkTestStatus("passed", "Item Added", page); - } - else - { - await MarkTestStatus("failed", "Test Failed", page); - } - } - catch (Exception err) - { - Console.WriteLine(err.Message); - await MarkTestStatus("failed", "Something Failed", page); - } - await browser.CloseAsync(); - } - public static async Task MarkTestStatus(string status, string reason, IPage page) - { - await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); - } -} diff --git a/PlaywrightLocalTest.cs b/PlaywrightLocalTest.cs index 3b1e4ab..5030481 100644 --- a/PlaywrightLocalTest.cs +++ b/PlaywrightLocalTest.cs @@ -3,34 +3,117 @@ using System; using System.Collections.Generic; using Newtonsoft.Json; +using BrowserStack; +using System.Collections; class PlaywrightLocalTest { + public static async Task main(string[] args) { - using var playwright = await Playwright.CreateAsync(); + // The following capability variables contains the set of os/browser environments where you want to run your tests. You can choose to alter this list according to your needs. Read more on https://browserstack.com/docs/automate/playwright/browsers-and-os + try + { + ArrayList capabilitiesList = getCapabilitiesList(); + Task[] taskList = new Task[capabilitiesList.Count]; + + Local local = new Local(); + + List> bsLocalArgs = new List>(); + bsLocalArgs.Add(new KeyValuePair("key", "BROWSERSTACK_ACCESS_KEY")); + bsLocalArgs.Add(new KeyValuePair("localIdentifier", "Test123")); + + local.start(bsLocalArgs); + + for (int i = 0; i < capabilitiesList.Count; i++) + { + string capsJson; + capsJson = JsonConvert.SerializeObject(capabilitiesList[i]); + var task = Executetestwithcaps(capsJson); + taskList[i] = task; + } + + await Task.WhenAll(taskList); + local.stop(); + + } + catch (Exception e) + { + Console.WriteLine(e); + } + } + + static ArrayList getCapabilitiesList() + { + ArrayList capabilitiesList = new ArrayList(); string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); - Dictionary browserstackOptions = new Dictionary(); - browserstackOptions.Add("name", "Playwright local sample test"); - browserstackOptions.Add("build", "playwright-dotnet-3"); - browserstackOptions.Add("os", "osx"); - browserstackOptions.Add("os_version", "catalina"); - browserstackOptions.Add("browser", "chrome"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); - browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - browserstackOptions.Add("browserstack.local", "true"); - string capsJson = JsonConvert.SerializeObject(browserstackOptions); - string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); + Dictionary windowsChromeCap = new Dictionary(); + windowsChromeCap.Add("browser", "chrome"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + windowsChromeCap.Add("browser_version", "latest"); + windowsChromeCap.Add("os", "Windows"); + windowsChromeCap.Add("os_version", "11"); + windowsChromeCap.Add("build", "browserstack-build-1"); + windowsChromeCap.Add("buildTag", "Regression"); + windowsChromeCap.Add("browserstack.debug", "true"); + windowsChromeCap.Add("browserstack.networkLogs", "true"); + windowsChromeCap.Add("browserstack.console", "info"); + windowsChromeCap.Add("browserstack.local", "true"); + windowsChromeCap.Add("browserstack.localIdentifier", "Test123"); + windowsChromeCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + windowsChromeCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(windowsChromeCap); + + + Dictionary venturaWebkitCap = new Dictionary(); + venturaWebkitCap.Add("browser", "playwright-webkit"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + venturaWebkitCap.Add("browser_version", "latest"); + venturaWebkitCap.Add("os", "osx"); + venturaWebkitCap.Add("os_version", "Ventura"); + venturaWebkitCap.Add("build", "browserstack-build-1"); + venturaWebkitCap.Add("buildTag", "Regression"); + venturaWebkitCap.Add("browserstack.debug", "true"); + venturaWebkitCap.Add("browserstack.networkLogs", "true"); + venturaWebkitCap.Add("browserstack.console", "info"); + venturaWebkitCap.Add("browserstack.local", "true"); + venturaWebkitCap.Add("browserstack.localIdentifier", "Test123"); + venturaWebkitCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + venturaWebkitCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(venturaWebkitCap); + + Dictionary windowsFirefoxCap = new Dictionary(); + windowsFirefoxCap.Add("browser", "playwright-firefox"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit`\ + windowsFirefoxCap.Add("browser_version", "latest"); + windowsFirefoxCap.Add("os", "Windows"); + windowsFirefoxCap.Add("os_version", "11"); + windowsFirefoxCap.Add("build", "browserstack-build-1"); + windowsFirefoxCap.Add("buildTag", "Regression"); + windowsFirefoxCap.Add("browserstack.debug", "true"); + windowsFirefoxCap.Add("browserstack.networkLogs", "true"); + windowsFirefoxCap.Add("browserstack.console", "info"); + windowsFirefoxCap.Add("browserstack.local", "true"); + windowsFirefoxCap.Add("browserstack.localIdentifier", "Test123"); + windowsFirefoxCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + windowsFirefoxCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(windowsFirefoxCap); + + return capabilitiesList; + } + + public static async Task Executetestwithcaps(string capabilities) + { + using var playwright = await Playwright.CreateAsync(); + string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capabilities); await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); var page = await browser.NewPageAsync(); try { + await MarkTestName(page); page.SetDefaultTimeout(60000); - await page.GotoAsync("https://localhost:3000/"); + await page.GotoAsync("http://localhost:3000/"); await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); @@ -50,9 +133,20 @@ public static async Task main(string[] args) await MarkTestStatus("failed", "Something Failed", page); } await browser.CloseAsync(); + } public static async Task MarkTestStatus(string status, string reason, IPage page) { await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); } + + public static async Task MarkTestName(IPage page) + { + string? thisFile = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName(); + string[] result = thisFile.Split(new char[] { '/' }); + string[] filenameResult = result.Last().Split(new char[] { '.' }); + string? testName = filenameResult.First(); + + await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionName\", \"arguments\": {\"name\":\"" + testName + "\"}}"); + } } diff --git a/PlaywrightParallelTest.cs b/PlaywrightParallelTest.cs index 175dfb4..1d715fe 100644 --- a/PlaywrightParallelTest.cs +++ b/PlaywrightParallelTest.cs @@ -37,60 +37,49 @@ static ArrayList getCapabilitiesList() string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); - Dictionary catalinaChromeCap = new Dictionary(); - catalinaChromeCap.Add("browser", "chrome"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - catalinaChromeCap.Add("browser_version", "latest"); - catalinaChromeCap.Add("os", "osx"); - catalinaChromeCap.Add("os_version", "Monterey"); - catalinaChromeCap.Add("name", "Branded Google Chrome on Monterey"); - catalinaChromeCap.Add("build", "playwright-dotnet-2"); - catalinaChromeCap.Add("browserstack.username", BROWSERSTACK_USERNAME); - catalinaChromeCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - capabilitiesList.Add(catalinaChromeCap); - - Dictionary catalinaEdgeCap = new Dictionary(); - catalinaEdgeCap.Add("browser", "edge"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - catalinaEdgeCap.Add("browser_version", "latest"); - catalinaEdgeCap.Add("os", "osx"); - catalinaEdgeCap.Add("os_version", "Monterey"); - catalinaEdgeCap.Add("name", "Branded Microsoft Edge on Monterey"); - catalinaEdgeCap.Add("build", "playwright-dotnet-2"); - catalinaEdgeCap.Add("browserstack.username", BROWSERSTACK_USERNAME); - catalinaEdgeCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - capabilitiesList.Add(catalinaEdgeCap); - - Dictionary catalinaFirefoxCap = new Dictionary(); - catalinaFirefoxCap.Add("browser", "playwright-firefox"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - catalinaFirefoxCap.Add("browser_version", "latest"); - catalinaFirefoxCap.Add("os", "osx"); - catalinaFirefoxCap.Add("os_version", "Monterey"); - catalinaFirefoxCap.Add("name", "Playwright firefox on Monterey"); - catalinaFirefoxCap.Add("build", "playwright-dotnet-2"); - catalinaFirefoxCap.Add("browserstack.username", BROWSERSTACK_USERNAME); - catalinaFirefoxCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - capabilitiesList.Add(catalinaFirefoxCap); - - Dictionary catalinaWebkitCap = new Dictionary(); - catalinaWebkitCap.Add("browser", "playwright-webkit"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit`\ - catalinaWebkitCap.Add("browser_version", "latest"); - catalinaWebkitCap.Add("os", "osx"); - catalinaWebkitCap.Add("os_version", "Monterey"); - catalinaWebkitCap.Add("name", "Playwright webkit on Monterey"); - catalinaWebkitCap.Add("build", "playwright-dotnet-2"); - catalinaWebkitCap.Add("browserstack.username", BROWSERSTACK_USERNAME); - catalinaWebkitCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - capabilitiesList.Add(catalinaWebkitCap); - - Dictionary catalinaChromiumCap = new Dictionary(); - catalinaChromiumCap.Add("browser", "playwright-chromium"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - catalinaChromiumCap.Add("browser_version", "latest"); - catalinaChromiumCap.Add("os", "osx"); - catalinaChromiumCap.Add("os_version", "Monterey"); - catalinaChromiumCap.Add("name", "Playwright webkit on Monterey"); - catalinaChromiumCap.Add("build", "playwright-dotnet-2"); - catalinaChromiumCap.Add("browserstack.username", BROWSERSTACK_USERNAME); - catalinaChromiumCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - capabilitiesList.Add(catalinaChromiumCap); + + Dictionary windowsChromeCap = new Dictionary(); + windowsChromeCap.Add("browser", "chrome"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + windowsChromeCap.Add("browser_version", "latest"); + windowsChromeCap.Add("os", "Windows"); + windowsChromeCap.Add("os_version", "11"); + windowsChromeCap.Add("build", "browserstack-build-1"); + windowsChromeCap.Add("buildTag", "Regression"); + windowsChromeCap.Add("browserstack.debug", "true"); + windowsChromeCap.Add("browserstack.networkLogs", "true"); + windowsChromeCap.Add("browserstack.console", "info"); + windowsChromeCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + windowsChromeCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(windowsChromeCap); + + + Dictionary venturaWebkitCap = new Dictionary(); + venturaWebkitCap.Add("browser", "playwright-webkit"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` + venturaWebkitCap.Add("browser_version", "latest"); + venturaWebkitCap.Add("os", "osx"); + venturaWebkitCap.Add("os_version", "Ventura"); + venturaWebkitCap.Add("build", "browserstack-build-1"); + venturaWebkitCap.Add("buildTag", "Regression"); + venturaWebkitCap.Add("browserstack.debug", "true"); + venturaWebkitCap.Add("browserstack.networkLogs", "true"); + venturaWebkitCap.Add("browserstack.console", "info"); + venturaWebkitCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + venturaWebkitCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(venturaWebkitCap); + + Dictionary windowsFirefoxCap = new Dictionary(); + windowsFirefoxCap.Add("browser", "playwright-firefox"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit`\ + windowsFirefoxCap.Add("browser_version", "latest"); + windowsFirefoxCap.Add("os", "Windows"); + windowsFirefoxCap.Add("os_version", "11"); + windowsFirefoxCap.Add("build", "browserstack-build-1"); + windowsFirefoxCap.Add("buildTag", "Regression"); + windowsFirefoxCap.Add("browserstack.debug", "true"); + windowsFirefoxCap.Add("browserstack.networkLogs", "true"); + windowsFirefoxCap.Add("browserstack.console", "info"); + windowsFirefoxCap.Add("browserstack.username", BROWSERSTACK_USERNAME); + windowsFirefoxCap.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); + capabilitiesList.Add(windowsFirefoxCap); return capabilitiesList; } @@ -105,6 +94,7 @@ public static async Task Executetestwithcaps(string capabilities) var page = await browser.NewPageAsync(); try { + await MarkTestName(page); page.SetDefaultTimeout(60000); await page.GotoAsync("https://bstackdemo.com/"); await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); @@ -131,4 +121,13 @@ public static async Task MarkTestStatus(string status, string reason, IPage page { await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); } + public static async Task MarkTestName(IPage page) + { + string? thisFile = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName(); + string[] result = thisFile.Split(new char[] { '/' }); + string[] filenameResult = result.Last().Split(new char[] { '.' }); + string? testName = filenameResult.First(); + + await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionName\", \"arguments\": {\"name\":\"" + testName + "\"}}"); + } } diff --git a/PlaywrightPixelTest.cs b/PlaywrightPixelTest.cs deleted file mode 100644 index ec6c8af..0000000 --- a/PlaywrightPixelTest.cs +++ /dev/null @@ -1,59 +0,0 @@ -using Microsoft.Playwright; -using System.Threading.Tasks; -using System; -using System.Collections.Generic; -using Newtonsoft.Json; - -class PlaywrightPixelTest -{ - public static async Task main(string[] args) - { - using var playwright = await Playwright.CreateAsync(); - - string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); - string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); - - Dictionary browserstackOptions = new Dictionary(); - browserstackOptions.Add("name", "Test on Playwright emulated Pixel 5"); - browserstackOptions.Add("build", "playwright-dotnet-4"); - browserstackOptions.Add("browser", "playwright-webkit"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); - browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - string capsJson = JsonConvert.SerializeObject(browserstackOptions); - string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); - - await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); - - var context = await browser.NewContextAsync(playwright.Devices["Pixel 5"]); // Complete list of devices - https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json - - var page = await context.NewPageAsync(); - try - { - page.SetDefaultTimeout(60000); - await page.GotoAsync("https://bstackdemo.com/"); - await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); - - var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); - - if (text == "iPhone 12") - { - await MarkTestStatus("passed", "Item Added", page); - } - else - { - await MarkTestStatus("failed", "Test Failed", page); - } - } - catch (Exception err) - { - Console.WriteLine(err.Message); - await MarkTestStatus("failed", "Something Failed", page); - } - await browser.CloseAsync(); - } - - public static async Task MarkTestStatus(string status, string reason, IPage page) - { - await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); - } -} diff --git a/PlaywrightTest.cs b/PlaywrightTest.cs deleted file mode 100644 index 9a73b3a..0000000 --- a/PlaywrightTest.cs +++ /dev/null @@ -1,60 +0,0 @@ -using Microsoft.Playwright; -using System.Threading.Tasks; -using System; -using System.Collections.Generic; -using Newtonsoft.Json; - -class PlaywrightTest -{ - public static async Task main(string[] args) - { - using var playwright = await Playwright.CreateAsync(); - - string? BROWSERSTACK_USERNAME = Environment.GetEnvironmentVariable("BROWSERSTACK_USERNAME"); - string? BROWSERSTACK_ACCESS_KEY = Environment.GetEnvironmentVariable("BROWSERSTACK_ACCESS_KEY"); - - Dictionary browserstackOptions = new Dictionary(); - browserstackOptions.Add("name", "Playwright first sample test"); - browserstackOptions.Add("build", "playwright-dotnet-1"); - browserstackOptions.Add("os", "osx"); - browserstackOptions.Add("os_version", "Monterey"); - browserstackOptions.Add("browser", "chrome"); // allowed browsers are `chrome`, `edge`, `playwright-chromium`, `playwright-firefox` and `playwright-webkit` - browserstackOptions.Add("browser_version", "latest"); - browserstackOptions.Add("browserstack.username", BROWSERSTACK_USERNAME); - browserstackOptions.Add("browserstack.accessKey", BROWSERSTACK_ACCESS_KEY); - string capsJson = JsonConvert.SerializeObject(browserstackOptions); - string cdpUrl = "wss://cdp.browserstack.com/playwright?caps=" + Uri.EscapeDataString(capsJson); - - await using var browser = await playwright.Chromium.ConnectAsync(cdpUrl); - var page = await browser.NewPageAsync(); - try - { - page.SetDefaultTimeout(60000); - await page.GotoAsync("https://bstackdemo.com/"); - - await page.Locator("#\\31 > .shelf-item__buy-btn").ClickAsync(); - - var text = await page.Locator("#__next > div > div > div.float-cart.float-cart--open > div.float-cart__content > div.float-cart__shelf-container > div > div.shelf-item__details > p.title").TextContentAsync(); - - if (text == "iPhone 12") - { - await MarkTestStatus("passed", "Item Added", page); - } - else - { - await MarkTestStatus("failed", "Test Failed", page); - } - } - catch (Exception err) - { - Console.WriteLine(err.Message); - await MarkTestStatus("failed", "Something Failed", page); - } - await browser.CloseAsync(); - } - - public static async Task MarkTestStatus(string status, string reason, IPage page) - { - await page.EvaluateAsync("_ => {}", "browserstack_executor: {\"action\": \"setSessionStatus\", \"arguments\": {\"status\":\"" + status + "\", \"reason\": \"" + reason + "\"}}"); - } -} diff --git a/Program.cs b/Program.cs index 7668599..bcd3417 100644 --- a/Program.cs +++ b/Program.cs @@ -9,10 +9,6 @@ public static async Task Main(string[] args) { switch (args[0]) { - case "single": - Console.WriteLine("Running Single Test"); - await PlaywrightTest.main(args); - break; case "parallel": Console.WriteLine("Running Parallel Test"); await PlaywrightParallelTest.main(args); @@ -21,17 +17,9 @@ public static async Task Main(string[] args) Console.WriteLine("Running Local Test"); await PlaywrightLocalTest.main(args); break; - case "iphonetest": - Console.WriteLine("Running iPhone Test"); - await PlaywrightIPhoneTest.main(args); - break; - case "pixeltest": - Console.WriteLine("Running Pixel Test"); - await PlaywrightPixelTest.main(args); - break; default: Console.WriteLine("Running Single Test by default"); - await PlaywrightTest.main(args); + await PlaywrightParallelTest.main(args); break; } } diff --git a/README.md b/README.md index a4aac82..8f317cd 100644 --- a/README.md +++ b/README.md @@ -12,24 +12,24 @@ ## Running your tests -- To run a single test, run `dotnet run single` - To run a parallel test, run command `dotnet run parallel` -- To run sessions on emulated devices, -`dotnet run iphonetest` or `dotnet run pixeltest` -You can specify any device name from the below list: -https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json - - ### Run sample test on privately hosted websites - - **Using Command-line Interface** - 1. You have to download the BrowserStack Local binary from the links below (depending on your environment): - * [OS X (10.7 and above)](https://www.browserstack.com/browserstack-local/BrowserStackLocal-darwin-x64.zip) - * [Linux 32-bit](https://www.browserstack.com/browserstack-local/BrowserStackLocal-linux-ia32.zip) - * [Linux 64-bit](https://www.browserstack.com/browserstack-local/BrowserStackLocal-linux-x64.zip) - * [Windows (XP and above)](https://www.browserstack.com/browserstack-local/BrowserStackLocal-win32.zip) - 2. Once you have downloaded and unzipped the file, you can initiate the binary by running the command: `./BrowserStackLocal --key YOUR_ACCESS_KEY` - 3. Once you see the terminal say "[SUCCESS]" You can now access your local server(s) in our remote browser”, your local testing connection is considered established. - 4. You can then run the sample Local test using `dotnet run local` + + ### [Web application hosted on internal environment] Running your tests on BrowserStack using BrowserStackLocal + + #### Prerequisites + + - Clone the [BrowserStack demo application](https://github.com/browserstack/browserstack-demo-app) repository. + ```sh + git clone https://github.com/browserstack/browserstack-demo-app + ``` + - Please follow the README.md on the BrowserStack demo application repository to install and start the dev server on localhost. + - Note: You may need to provide additional BrowserStackLocal arguments to successfully connect your localhost environment with BrowserStack infrastructure. (e.g if you are behind firewalls, proxy or VPN). + - Further details for successfully creating a BrowserStackLocal connection can be found here: + + - [Local Testing with Automate](https://www.browserstack.com/local-testing/automate) + + #### Running the test using Local Testing: + - You can then run the sample Local test using `dotnet run local` ## Notes