Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

[dotnet] Add examples for BiDi W3C Browsing Context #1940

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
nvborisenko wants to merge 24 commits into SeleniumHQ:trunk
base: trunk
Choose a base branch
Loading
from nvborisenko:dotnet-bidi-browsingcontext
Draft
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
7d92ca5
Some tests for browsing context
nvborisenko Sep 10, 2024
34a0c78
More examples
nvborisenko Sep 10, 2024
2b3816b
Update BrowsingContextTest.FragmentNavigatedEvent.cs
nvborisenko Sep 10, 2024
d23ff62
Task completion source for events
nvborisenko Sep 10, 2024
a6b1e44
Add more
nvborisenko Sep 12, 2024
2a8aa0b
Get tree
nvborisenko Sep 14, 2024
1ba4589
Group events
nvborisenko Sep 14, 2024
2e02cc2
Finish examples
nvborisenko Sep 14, 2024
cf93f36
Simplify browsing context
nvborisenko Sep 14, 2024
a108d99
Add example how to print 7.. pages
nvborisenko Sep 14, 2024
adda703
Simplify browsing context type
nvborisenko Sep 15, 2024
12f9167
BiDi is exposed from browsing context
nvborisenko Sep 15, 2024
0cd9dc3
Consistent AsBiDirectional naming
nvborisenko Sep 16, 2024
c3d85b9
Make it even shorter
nvborisenko Sep 16, 2024
0e4bd13
Use stable selenium
nvborisenko Sep 20, 2024
04704a1
Do no show that BiDi object is disposable
nvborisenko Sep 20, 2024
a5bf483
No sandbox to be able to print a page
nvborisenko Sep 20, 2024
90aa4c1
Upgrade
nvborisenko Oct 31, 2024
8e9763c
Merge remote-tracking branch 'upstream/trunk' into dotnet-bidi-browsi...
nvborisenko Dec 14, 2024
6ef220a
Simplify capture element screenshot
nvborisenko Dec 14, 2024
7b0b273
Merge remote-tracking branch 'upstream/trunk' into dotnet-bidi-browsi...
nvborisenko Mar 22, 2025
b93f3c2
Actualize to 4.30
nvborisenko Mar 22, 2025
9a9bbd7
Break some of them
nvborisenko Mar 22, 2025
f121c9e
Simplify
nvborisenko Mar 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion examples/dotnet/SeleniumDocs/BaseTest.cs
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ protected void StartDriver(string browserVersion = "stable")
{
ChromeOptions options = new ChromeOptions
{
BrowserVersion = browserVersion
BrowserVersion = browserVersion,
UseWebSocketUrl = true,
};
driver = new ChromeDriver(options);
}
Expand Down
View file Open in desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.BiDi;
using System.Threading.Tasks;

namespace SeleniumDocs.BiDi.BrowsingContext;

partial class BrowsingContextTest
{
[TestMethod]
public async Task Activate()
{
var context = await driver.AsBidirectionalContextAsync();

await context.ActivateAsync();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.BiDi;
using OpenQA.Selenium.BiDi.Modules.BrowsingContext;
using System.Threading.Tasks;

namespace SeleniumDocs.BiDi.BrowsingContext;

partial class BrowsingContextTest
{
[TestMethod]
public async Task CaptureScreenshot()
{
var context = await driver.AsBidirectionalContextAsync();

var screenshot = await context.CaptureScreenshotAsync();

Assert.IsNotNull(screenshot);
Assert.IsNotNull(screenshot.Data);
Assert.IsNotNull(screenshot.ToByteArray());
}

[TestMethod]
public async Task CaptureViewportScreenshot()
{
var context = await driver.AsBidirectionalContextAsync();

var screenshot = await context.CaptureScreenshotAsync(new() { Clip = new BoxClipRectangle(5, 5, 10, 10) });

Assert.IsNotNull(screenshot);
Assert.IsNotNull(screenshot.Data);
}

[TestMethod]
public async Task CaptureElementScreenshot()
{
var context = await driver.AsBidirectionalContextAsync();

driver.Url = "https://www.selenium.dev/selenium/web/formPage.html";

var element = (await context.LocateNodesAsync(Locator.Css("#checky")))[0];

//TODO: ShareId is a type, not string
Copy link
Member Author

@nvborisenko nvborisenko Sep 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then we can implicitly convert RemoteNodeValue (if I remember correctly) to SharedId.

await context.CaptureScreenshotAsync(new() { Clip = new ElementClipRectangle(element) });

And moving forfard:

await context.CaptureScreenshotAsync(new() { Clip = ClipRectangle.Element(element) });

var screenshot = await context.CaptureScreenshotAsync(new() { Clip = new ElementClipRectangle(new(element.SharedId)) });

Assert.IsNotNull(screenshot);
Assert.IsNotNull(screenshot.Data);
}
}
View file Open in desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.BiDi;
using OpenQA.Selenium.BiDi.Modules.BrowsingContext;
using System.Threading.Tasks;

namespace SeleniumDocs.BiDi.BrowsingContext;

partial class BrowsingContextTest
{
[TestMethod]
public async Task CloseTab()
{
await using var bidi = await driver.AsBidirectionalAsync();

var context = await bidi.CreateContextAsync(ContextType.Tab);

await context.CloseAsync();
}

[TestMethod]
public async Task CloseWindow()
{
await using var bidi = await driver.AsBidirectionalAsync();

var context = await bidi.CreateContextAsync(ContextType.Window);

await context.CloseAsync();
}
}
View file Open in desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.BiDi;
using OpenQA.Selenium.BiDi.Modules.BrowsingContext;
using System.Threading.Tasks;

namespace SeleniumDocs.BiDi.BrowsingContext;

partial class BrowsingContextTest
{
[TestMethod]
public async Task OpenNewTab()
{
await using var bidi = await driver.AsBidirectionalAsync();

var context = await bidi.CreateContextAsync(ContextType.Tab);

Assert.IsNotNull(context);
}

[TestMethod]
public async Task OpenNewWindow()
{
await using var bidi = await driver.AsBidirectionalAsync();

var context = await bidi.CreateContextAsync(ContextType.Window);

Assert.IsNotNull(context);
}

[TestMethod]
public async Task OpenTabWithReferenceBrowsingContext()
{
var context1 = await driver.AsBidirectionalContextAsync();

var context2 = await context1.BiDi.CreateContextAsync(ContextType.Tab, new() { ReferenceContext = context1 });
Copy link
Member Author

@nvborisenko nvborisenko Sep 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would be great if context1 can expose CreateContextAsync method, which implicitly sets ReferenceContext to the context1


Assert.IsNotNull(context2);
}

[TestMethod]
public async Task OpenWindowWithReferenceBrowsingContext()
{
var context1 = await driver.AsBidirectionalContextAsync();

var context2 = await context1.BiDi.CreateContextAsync(ContextType.Window, new() { ReferenceContext = context1 });

Assert.IsNotNull(context2);
}

[TestMethod]
public async Task UseExistingWindowHandle()
{
var context = await driver.AsBidirectionalContextAsync();

Assert.IsNotNull(context);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.BiDi;
using OpenQA.Selenium.BiDi.Modules.BrowsingContext;
using System;
using System.Threading.Tasks;

namespace SeleniumDocs.BiDi.BrowsingContext;

partial class BrowsingContextTest
{
[TestMethod]
public async Task BrowsingContextCreatedEvent()
{
await using var bidi = await driver.AsBidirectionalAsync();

TaskCompletionSource<BrowsingContextInfo> tcs = new();

await bidi.OnContextCreatedAsync(tcs.SetResult);

driver.SwitchTo().NewWindow(OpenQA.Selenium.WindowType.Window);

var info = await tcs.Task.WaitAsync(TimeSpan.FromSeconds(5));

Assert.IsNotNull(info);
Console.WriteLine(info);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.BiDi;
using OpenQA.Selenium.BiDi.Modules.BrowsingContext;
using System;
using System.Threading.Tasks;

namespace SeleniumDocs.BiDi.BrowsingContext;

partial class BrowsingContextTest
{
[TestMethod]
public async Task BrowsingContextDestroyedEvent()
{
await using var bidi = await driver.AsBidirectionalAsync();

var context = await driver.AsBidirectionalContextAsync();

TaskCompletionSource<BrowsingContextInfo> tcs = new();

await bidi.OnContextDestroyedAsync(tcs.SetResult);

await context.CloseAsync();

var contextInfo = await tcs.Task.WaitAsync(TimeSpan.FromSeconds(5));

Assert.IsNotNull(contextInfo);
Assert.AreEqual(context, contextInfo.Context);
Console.WriteLine(contextInfo);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.BiDi;
using OpenQA.Selenium.BiDi.Modules.BrowsingContext;
using System;
using System.Threading.Tasks;

namespace SeleniumDocs.BiDi.BrowsingContext;

partial class BrowsingContextTest
{
[TestMethod]
public async Task BrowsingContextLoadedEvent()
{
var context = await driver.AsBidirectionalContextAsync();

TaskCompletionSource<NavigationInfo> tcs = new();

await context.OnLoadAsync(tcs.SetResult);

await context.NavigateAsync("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html", new() { Wait = ReadinessState.Complete });

var navigationInfo = await tcs.Task.WaitAsync(TimeSpan.FromSeconds(5));

Assert.IsNotNull(navigationInfo);
Console.WriteLine(navigationInfo);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.BiDi;
using OpenQA.Selenium.BiDi.Modules.BrowsingContext;
using System;
using System.Threading.Tasks;

namespace SeleniumDocs.BiDi.BrowsingContext;

partial class BrowsingContextTest
{
[TestMethod]
public async Task DomContentLoadedEvent()
{
var context = await driver.AsBidirectionalContextAsync();

TaskCompletionSource<NavigationInfo> tcs = new();

await context.OnDomContentLoadedAsync(tcs.SetResult);

await context.NavigateAsync("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html", new() { Wait = ReadinessState.Complete });

var navigationInfo = await tcs.Task.WaitAsync(TimeSpan.FromSeconds(5));

Assert.IsNotNull(navigationInfo);
Console.WriteLine(navigationInfo);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.BiDi;
using OpenQA.Selenium.BiDi.Modules.BrowsingContext;
using System;
using System.Threading.Tasks;

namespace SeleniumDocs.BiDi.BrowsingContext;

partial class BrowsingContextTest
{
[TestMethod]
public async Task FragmentNavigatedEvent()
{
var context = await driver.AsBidirectionalContextAsync();

await context.NavigateAsync("https://www.selenium.dev/selenium/web/linked_image.html", new() { Wait = ReadinessState.Complete });

TaskCompletionSource<NavigationInfo> tcs = new();

await context.OnFragmentNavigatedAsync(tcs.SetResult);

await context.NavigateAsync("https://www.selenium.dev/selenium/web/linked_image.html#linkToAnchorOnThisPage", new() { Wait = ReadinessState.Complete });

var navigationInfo = await tcs.Task.WaitAsync(TimeSpan.FromSeconds(5));

Assert.IsNotNull(navigationInfo);
Console.WriteLine(navigationInfo);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.BiDi;
using OpenQA.Selenium.BiDi.Modules.BrowsingContext;
using System;
using System.Threading.Tasks;

namespace SeleniumDocs.BiDi.BrowsingContext;

partial class BrowsingContextTest
{
[TestMethod]
public async Task NavigationStartedEvent()
{
var context = await driver.AsBidirectionalContextAsync();

TaskCompletionSource<NavigationInfo> tcs = new();

await context.OnNavigationStartedAsync(tcs.SetResult);

await context.NavigateAsync("https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html", new() { Wait = ReadinessState.Complete });

var info = await tcs.Task.WaitAsync(TimeSpan.FromSeconds(5));

Assert.IsNotNull(info);
}
}
View file Open in desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.BiDi;
using OpenQA.Selenium.BiDi.Modules.BrowsingContext;
using System;
using System.Threading.Tasks;

namespace SeleniumDocs.BiDi.BrowsingContext;

partial class BrowsingContextTest
{
[TestMethod]
public async Task UserPromptOpenedEvent()
{
var context = await driver.AsBidirectionalContextAsync();

TaskCompletionSource<UserPromptOpenedEventArgs> tcs = new();

await context.NavigateAsync("https://www.selenium.dev/selenium/web/alerts.html", new() { Wait = ReadinessState.Complete });

//TODO; THhis event can be a part of context
await context.BiDi.OnUserPromptOpenedAsync(tcs.SetResult);

driver.FindElement(By.Id("prompt")).Click();

var userPromptOpenedEventArgs = await tcs.Task.WaitAsync(TimeSpan.FromSeconds(5));

Assert.IsNotNull(userPromptOpenedEventArgs);
Console.WriteLine(userPromptOpenedEventArgs);
}

[TestMethod]
public async Task UserPromptClosedEvent()
{
var context = await driver.AsBidirectionalContextAsync();

TaskCompletionSource<UserPromptClosedEventArgs> tcs = new();

await context.NavigateAsync("https://www.selenium.dev/selenium/web/alerts.html", new() { Wait = ReadinessState.Complete });

//TODO; THhis event can be a part of context
await context.BiDi.OnUserPromptClosedAsync(tcs.SetResult);

driver.FindElement(By.Id("prompt")).Click();

//await context.HandleUserPromptAsync();

var userPromptClosedEventArgs = await tcs.Task.WaitAsync(TimeSpan.FromSeconds(5));

Assert.IsNotNull(userPromptClosedEventArgs);
Console.WriteLine(userPromptClosedEventArgs);
}
}
Loading

AltStyle によって変換されたページ (->オリジナル) /