Skip to content

Commit d5caa54

Browse files
authored
[BREAKING] Introduce Realm entity (#2356)
* [BREAKING] Introduce Real entity Worker was renamed to WebWorker. IExecutionContext.QueryObjectsAsync was removed. * fix build * Remove outdated tests * Update hover implementation * fix build * fix a build * Fix function * more progress * Fix some builds * Fix get property * Fix cast * Fix transfer handle * Move isolation to the element handle * Fix transfer * fix array conversion * Undo changes. Error will come * Fix array translation * More fixes * Another change * Undo some changes * More validations * Fix is hidden * Validate execution context * Increase timeout * fix workers * Revert "Increase timeout" This reverts commit 9419592. * fix firefox test
1 parent 4eb4b46 commit d5caa54

39 files changed

+1159
-1176
lines changed

lib/PuppeteerSharp.Tests/AriaQueryHandlerTests/WaitForSelectorAriaTests.cs

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,22 @@
11
using System;
2-
using System.Configuration;
3-
using System.Diagnostics;
42
using System.Linq;
5-
using System.Reflection.Metadata;
6-
using System.Reflection.PortableExecutable;
73
using System.Threading.Tasks;
8-
using System.Xml.Linq;
9-
using Microsoft.AspNetCore.Hosting.Server;
104
using PuppeteerSharp.Tests.Attributes;
115
using PuppeteerSharp.Nunit;
12-
using SixLabors.ImageSharp;
13-
using static System.Net.Mime.MediaTypeNames;
146
using NUnit.Framework;
157

168
namespace PuppeteerSharp.Tests.AriaQueryHandlerTests
179
{
1810
public class WaitForSelectorAriaTests : PuppeteerPageBaseTest
1911
{
20-
public WaitForSelectorAriaTests(): base()
21-
{
22-
}
23-
24-
const string addElement = @"(tag) => document.body.appendChild(document.createElement(tag))";
12+
private const string AddElement = @"(tag) => document.body.appendChild(document.createElement(tag))";
2513

2614
[PuppeteerTest("ariaqueryhandler.spec.ts", "waitForSelector (aria)", "should immediately resolve promise if node exists")]
2715
[Skip(SkipAttribute.Targets.Firefox)]
2816
public async Task ShouldImmediatelyResolvePromiseIfNodeExists()
2917
{
3018
await Page.GoToAsync(TestConstants.EmptyPage);
31-
await Page.EvaluateFunctionAsync(addElement, "button");
19+
await Page.EvaluateFunctionAsync(AddElement, "button");
3220
await Page.WaitForSelectorAsync("aria/[role=\"button\"]");
3321
}
3422

@@ -50,10 +38,10 @@ await Page.EvaluateFunctionAsync(
5038
public async Task ShouldPersistQueryHandlerBindingsAcrossReloads()
5139
{
5240
await Page.GoToAsync(TestConstants.EmptyPage);
53-
await Page.EvaluateFunctionAsync(addElement, "button");
41+
await Page.EvaluateFunctionAsync(AddElement, "button");
5442
await Page.WaitForSelectorAsync("aria/[role=\"button\"]");
5543
await Page.ReloadAsync();
56-
await Page.EvaluateFunctionAsync(addElement, "button");
44+
await Page.EvaluateFunctionAsync(AddElement, "button");
5745
await Page.WaitForSelectorAsync("aria/[role=\"button\"]");
5846
}
5947

@@ -62,10 +50,10 @@ public async Task ShouldPersistQueryHandlerBindingsAcrossReloads()
6250
public async Task ShouldPersistQueryHandlerBindingsAcrossNavigations()
6351
{
6452
await Page.GoToAsync("data:text/html,");
65-
await Page.EvaluateFunctionAsync(addElement, "button");
53+
await Page.EvaluateFunctionAsync(AddElement, "button");
6654
await Page.WaitForSelectorAsync("aria/[role=\"button\"]");
6755
await Page.GoToAsync("data:text/html,");
68-
await Page.EvaluateFunctionAsync(addElement, "button");
56+
await Page.EvaluateFunctionAsync(AddElement, "button");
6957
await Page.WaitForSelectorAsync("aria/[role=\"button\"]");
7058
}
7159

@@ -75,7 +63,7 @@ public async Task ShouldWorkIndependentlyOfExposeFunction()
7563
{
7664
await Page.GoToAsync(TestConstants.EmptyPage);
7765
await Page.ExposeFunctionAsync("ariaQuerySelector", new Func<int, int, int>((a, b) => a + b));
78-
await Page.EvaluateFunctionAsync(addElement, "button");
66+
await Page.EvaluateFunctionAsync(AddElement, "button");
7967
await Page.WaitForSelectorAsync("aria/[role=\"button\"]");
8068
var result = await Page.EvaluateExpressionAsync<int>("globalThis.ariaQuerySelector(2,8)");
8169
Assert.AreEqual(10, result);
@@ -101,8 +89,8 @@ public async Task ShouldResolvePromiseWhenNodeIsAdded()
10189
await Page.GoToAsync(TestConstants.EmptyPage);
10290
var frame = Page.MainFrame;
10391
var watchdog = frame.WaitForSelectorAsync("aria/[role=\"heading\"]");
104-
await frame.EvaluateFunctionAsync(addElement, "br");
105-
await frame.EvaluateFunctionAsync(addElement, "h1");
92+
await frame.EvaluateFunctionAsync(AddElement, "br");
93+
await frame.EvaluateFunctionAsync(AddElement, "h1");
10694
var elementHandle = await watchdog;
10795
var tagName = await (
10896
await elementHandle.GetPropertyAsync("tagName")
@@ -112,11 +100,11 @@ await elementHandle.GetPropertyAsync("tagName")
112100

113101
[PuppeteerTest("ariaqueryhandler.spec.ts", "waitForSelector (aria)", "should work when node is added through innerHTML")]
114102
[Skip(SkipAttribute.Targets.Firefox)]
115-
public async Task ShouldWorkWhenNodeIsAddedThroughInnerHTML()
103+
public async Task ShouldWorkWhenNodeIsAddedThroughInnerHtml()
116104
{
117105
await Page.GoToAsync(TestConstants.EmptyPage);
118106
var watchdog = Page.WaitForSelectorAsync("aria/name");
119-
await Page.EvaluateFunctionAsync(addElement, "span");
107+
await Page.EvaluateFunctionAsync(AddElement, "span");
120108
await Page.EvaluateFunctionAsync(@"() => {
121109
return (document.querySelector('span').innerHTML =
122110
'<h3><div aria-label=""name""></div></h3>');
@@ -132,10 +120,10 @@ public async Task PageWaitForSelectorIsShortcutForMainFrame()
132120
await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage);
133121
var otherFrame = Page.FirstChildFrame();
134122
var watchdog = Page.WaitForSelectorAsync("aria/[role=\"button\"]");
135-
await otherFrame.EvaluateFunctionAsync(addElement, "button");
136-
await Page.EvaluateFunctionAsync(addElement, "button");
123+
await otherFrame.EvaluateFunctionAsync(AddElement, "button");
124+
await Page.EvaluateFunctionAsync(AddElement, "button");
137125
var elementHandle = await watchdog;
138-
Assert.AreSame(elementHandle.ExecutionContext.Frame, Page.MainFrame);
126+
Assert.AreSame(elementHandle.Frame, Page.MainFrame);
139127
}
140128

141129
[PuppeteerTest("ariaqueryhandler.spec.ts", "waitForSelector (aria)", "should run in specified frame")]
@@ -147,10 +135,10 @@ public async Task ShouldRunInSpecifiedFrame()
147135
var frame1 = Page.Frames.First(frame => frame.Name == "frame1");
148136
var frame2 = Page.Frames.First(frame => frame.Name == "frame2");
149137
var waitForSelectorTask = frame2.WaitForSelectorAsync("aria/[role=\"button\"]");
150-
await frame1.EvaluateFunctionAsync(addElement, "button");
151-
await frame2.EvaluateFunctionAsync(addElement, "button");
138+
await frame1.EvaluateFunctionAsync(AddElement, "button");
139+
await frame2.EvaluateFunctionAsync(AddElement, "button");
152140
var elementHandle = await waitForSelectorTask;
153-
Assert.AreSame(elementHandle.ExecutionContext.Frame, frame2);
141+
Assert.AreSame(elementHandle.Frame, frame2);
154142
}
155143
}
156144
}

lib/PuppeteerSharp.Tests/ElementHandleTests/ClickTests.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,23 @@ public async Task ShouldWorkForShadowDomV1()
3232
Assert.True(await Page.EvaluateExpressionAsync<bool>("clicked"));
3333
}
3434

35-
[PuppeteerTest("elementhandle.spec.ts", "ElementHandle.click", "should work for TextNodes")]
35+
[PuppeteerTest("elementhandle.spec.ts", "ElementHandle.click", "should not work for TextNodes")]
3636
[PuppeteerTimeout]
37-
public async Task ShouldWorkForTextNodes()
37+
public async Task ShouldNotWorkForTextNodes()
3838
{
3939
await Page.GoToAsync(TestConstants.ServerUrl + "/input/button.html");
4040
var buttonTextNode = (IElementHandle)await Page.EvaluateExpressionHandleAsync(
4141
"document.querySelector('button').firstChild");
42-
var exception = Assert.ThrowsAsync<PuppeteerException>(async () => await buttonTextNode.ClickAsync());
43-
Assert.AreEqual("Node is not of type HTMLElement", exception.Message);
42+
var exception = Assert.ThrowsAsync<EvaluationFailedException>(async () => await buttonTextNode.ClickAsync());
43+
44+
if (TestConstants.IsChrome)
45+
{
46+
Assert.That(exception.Message, Does.Contain("is not of type 'Element'"));
47+
}
48+
else
49+
{
50+
Assert.That(exception.Message, Does.Contain("implement interface Element"));
51+
}
4452
}
4553

4654
[PuppeteerTest("elementhandle.spec.ts", "ElementHandle.click", "should throw for detached nodes")]
@@ -51,7 +59,7 @@ public async Task ShouldThrowForDetachedNodes()
5159
var button = await Page.QuerySelectorAsync("button");
5260
await Page.EvaluateFunctionAsync("button => button.remove()", button);
5361
var exception = Assert.ThrowsAsync<PuppeteerException>(async () => await button.ClickAsync());
54-
Assert.AreEqual("Node is detached from document", exception.Message);
62+
Assert.AreEqual("Node is either not visible or not an HTMLElement", exception.Message);
5563
}
5664

5765
[PuppeteerTest("elementhandle.spec.ts", "ElementHandle.click", "should throw for hidden nodes")]

lib/PuppeteerSharp.Tests/EvaluationTests/PageEvaluateTests.cs

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -298,23 +298,6 @@ public async Task ShouldSimulateAUserGesture()
298298
return document.execCommand('copy');
299299
}"));
300300

301-
[PuppeteerTest("evaluation.spec.ts", "Page.evaluate", "should throw a nice error after a navigation")]
302-
[Skip(SkipAttribute.Targets.Firefox)]
303-
public async Task ShouldThrowANiceErrorAfterANavigation()
304-
{
305-
var executionContext = await Page.MainFrame.GetExecutionContextAsync();
306-
307-
await Task.WhenAll(
308-
Page.WaitForNavigationAsync(),
309-
executionContext.EvaluateFunctionAsync("() => window.location.reload()")
310-
);
311-
var ex = Assert.ThrowsAsync<EvaluationFailedException>(() =>
312-
{
313-
return executionContext.EvaluateFunctionAsync("() => null");
314-
});
315-
StringAssert.Contains("navigation", ex.Message);
316-
}
317-
318301
[PuppeteerTest("evaluation.spec.ts", "Page.evaluate", "should not throw an error when evaluation does a navigation")]
319302
[Skip(SkipAttribute.Targets.Firefox)]
320303
public async Task ShouldNotThrowAnErrorWhenEvaluationDoesANavigation()

lib/PuppeteerSharp.Tests/FrameTests/ExecutionContextTests.cs

Lines changed: 0 additions & 44 deletions
This file was deleted.

lib/PuppeteerSharp.Tests/HeadfulTests/HeadfulTests.cs

Lines changed: 42 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class HeadfulTests : PuppeteerBaseTest
1414
{
1515
private readonly LaunchOptions _forcedOopifOptions;
1616

17-
public HeadfulTests(): base()
17+
public HeadfulTests()
1818
{
1919
_forcedOopifOptions = TestConstants.DefaultBrowserOptions();
2020
_forcedOopifOptions.Headless = false;
@@ -29,9 +29,9 @@ public HeadfulTests(): base()
2929
[Skip(SkipAttribute.Targets.Firefox)]
3030
public async Task BackgroundPageTargetTypeShouldBeAvailable()
3131
{
32-
await using (var browserWithExtension = await Puppeteer.LaunchAsync(
32+
await using var browserWithExtension = await Puppeteer.LaunchAsync(
3333
TestConstants.BrowserWithExtensionOptions(),
34-
TestConstants.LoggerFactory))
34+
TestConstants.LoggerFactory);
3535
await using (await browserWithExtension.NewPageAsync())
3636
{
3737
var backgroundPageTarget = await browserWithExtension.WaitForTargetAsync(t => t.Type == TargetType.BackgroundPage);
@@ -43,59 +43,51 @@ public async Task BackgroundPageTargetTypeShouldBeAvailable()
4343
[Ignore("Marked as Fail/Pass upstream")]
4444
public async Task TargetPageShouldReturnABackgroundPage()
4545
{
46-
await using (var browserWithExtension = await Puppeteer.LaunchAsync(
46+
await using var browserWithExtension = await Puppeteer.LaunchAsync(
4747
TestConstants.BrowserWithExtensionOptions(),
48-
TestConstants.LoggerFactory))
49-
{
50-
var backgroundPageTarget = await browserWithExtension.WaitForTargetAsync(t => t.Type == TargetType.BackgroundPage);
51-
await using (var page = await backgroundPageTarget.PageAsync())
52-
{
53-
Assert.AreEqual(6, await page.EvaluateFunctionAsync<int>("() => 2 * 3"));
54-
Assert.AreEqual(42, await page.EvaluateFunctionAsync<int>("() => window.MAGIC"));
55-
}
56-
}
48+
TestConstants.LoggerFactory);
49+
var backgroundPageTarget = await browserWithExtension.WaitForTargetAsync(t => t.Type == TargetType.BackgroundPage);
50+
await using var page = await backgroundPageTarget.PageAsync();
51+
Assert.AreEqual(6, await page.EvaluateFunctionAsync<int>("() => 2 * 3"));
52+
Assert.AreEqual(42, await page.EvaluateFunctionAsync<int>("() => window.MAGIC"));
5753
}
5854

5955
[PuppeteerTest("headful.spec.ts", "HEADFUL", "should have default url when launching browser")]
6056
[Skip(SkipAttribute.Targets.Firefox)]
6157
public async Task ShouldHaveDefaultUrlWhenLaunchingBrowser()
6258
{
63-
await using (var browser = await Puppeteer.LaunchAsync(
59+
await using var browser = await Puppeteer.LaunchAsync(
6460
TestConstants.BrowserWithExtensionOptions(),
65-
TestConstants.LoggerFactory))
66-
{
67-
var pages = (await browser.PagesAsync()).Select(page => page.Url).ToArray();
68-
Assert.AreEqual(new[] { "about:blank" }, pages);
69-
}
61+
TestConstants.LoggerFactory);
62+
var pages = (await browser.PagesAsync()).Select(page => page.Url).ToArray();
63+
Assert.AreEqual(new[] { "about:blank" }, pages);
7064
}
7165

7266
[PuppeteerTest("headful.spec.ts", "HEADFUL", "headless should be able to read cookies written by headful")]
7367
[Ignore("Puppeteer ignores this in windows we do not have a platform filter yet")]
7468
public async Task HeadlessShouldBeAbleToReadCookiesWrittenByHeadful()
7569
{
76-
using (var userDataDir = new TempDirectory())
70+
using var userDataDir = new TempDirectory();
71+
var launcher = new Launcher(TestConstants.LoggerFactory);
72+
var options = TestConstants.DefaultBrowserOptions();
73+
options.Args = options.Args.Concat(new[] { $"--user-data-dir=\"{userDataDir}\"" }).ToArray();
74+
options.Headless = false;
75+
await using (var browser = await launcher.LaunchAsync(options))
76+
await using (var page = await browser.NewPageAsync())
7777
{
78-
var launcher = new Launcher(TestConstants.LoggerFactory);
79-
var options = TestConstants.DefaultBrowserOptions();
80-
options.Args = options.Args.Concat(new[] { $"--user-data-dir=\"{userDataDir}\"" }).ToArray();
81-
options.Headless = false;
82-
await using (var browser = await launcher.LaunchAsync(options))
83-
await using (var page = await browser.NewPageAsync())
84-
{
85-
await page.GoToAsync(TestConstants.EmptyPage);
86-
await page.EvaluateExpressionAsync(
87-
"document.cookie = 'foo=true; expires=Fri, 31 Dec 9999 23:59:59 GMT'");
88-
}
78+
await page.GoToAsync(TestConstants.EmptyPage);
79+
await page.EvaluateExpressionAsync(
80+
"document.cookie = 'foo=true; expires=Fri, 31 Dec 9999 23:59:59 GMT'");
81+
}
8982

90-
await TestUtils.WaitForCookieInChromiumFileAsync(userDataDir.Path, "foo");
83+
await TestUtils.WaitForCookieInChromiumFileAsync(userDataDir.Path, "foo");
9184

92-
options.Headless = true;
93-
await using (var browser2 = await Puppeteer.LaunchAsync(options, TestConstants.LoggerFactory))
94-
{
95-
var page2 = await browser2.NewPageAsync();
96-
await page2.GoToAsync(TestConstants.EmptyPage);
97-
Assert.AreEqual("foo=true", await page2.EvaluateExpressionAsync<string>("document.cookie"));
98-
}
85+
options.Headless = true;
86+
await using (var browser2 = await Puppeteer.LaunchAsync(options, TestConstants.LoggerFactory))
87+
{
88+
var page2 = await browser2.NewPageAsync();
89+
await page2.GoToAsync(TestConstants.EmptyPage);
90+
Assert.AreEqual("foo=true", await page2.EvaluateExpressionAsync<string>("document.cookie"));
9991
}
10092
}
10193

@@ -106,24 +98,22 @@ public async Task OOPIFShouldReportGoogleComFrame()
10698
// https://google.com is isolated by default in Chromium embedder.
10799
var headfulOptions = TestConstants.DefaultBrowserOptions();
108100
headfulOptions.Headless = false;
109-
await using (var browser = await Puppeteer.LaunchAsync(headfulOptions))
110-
await using (var page = await browser.NewPageAsync())
111-
{
112-
await page.GoToAsync(TestConstants.EmptyPage);
113-
await page.SetRequestInterceptionAsync(true);
114-
page.Request += async (_, e) => await e.Request.RespondAsync(
115-
new ResponseData { Body = "{ body: 'YO, GOOGLE.COM'}" });
116-
await page.EvaluateFunctionHandleAsync(@"() => {
101+
await using var browser = await Puppeteer.LaunchAsync(headfulOptions);
102+
await using var page = await browser.NewPageAsync();
103+
await page.GoToAsync(TestConstants.EmptyPage);
104+
await page.SetRequestInterceptionAsync(true);
105+
page.Request += async (_, e) => await e.Request.RespondAsync(
106+
new ResponseData { Body = "{ body: 'YO, GOOGLE.COM'}" });
107+
await page.EvaluateFunctionHandleAsync(@"() => {
117108
const frame = document.createElement('iframe');
118109
frame.setAttribute('src', 'https://google.com/');
119110
document.body.appendChild(frame);
120111
return new Promise(x => frame.onload = x);
121112
}");
122-
await page.WaitForSelectorAsync("iframe[src=\"https://google.com/\"]");
123-
var urls = Array.ConvertAll(page.Frames, frame => frame.Url);
124-
Array.Sort(urls);
125-
Assert.AreEqual(new[] { TestConstants.EmptyPage, "https://google.com/" }, urls);
126-
}
113+
await page.WaitForSelectorAsync("iframe[src=\"https://google.com/\"]");
114+
var urls = Array.ConvertAll(page.Frames, frame => frame.Url);
115+
Array.Sort((Array)urls);
116+
Assert.AreEqual(new[] { TestConstants.EmptyPage, "https://google.com/" }, urls);
127117
}
128118

129119
[PuppeteerTest("headful.spec.ts", "HEADFUL", "OOPIF: should expose events within OOPIFs")]

0 commit comments

Comments
 (0)