public async Task ShouldReturnNullForDocumentDocumentElement() { await Page.GoToAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); var frame = Page.Frames[1]; var elementHandle = (IElementHandle)await frame.EvaluateHandleAsync("() => document.documentElement"); Assert.Null(await elementHandle.GetContentFrameAsync()); }
public async Task ShouldFireForIframes() { var requests = new List <IRequest>(); Page.Request += (sender, e) => requests.Add(e.Request); await Page.GoToAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); Assert.Equal(2, requests.Count); }
public async Task ShouldWorkForCrossFrameEvaluations() { await Page.GoToAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); var frame = Page.Frames[1]; var elementHandle = (IElementHandle)await frame.EvaluateHandleAsync("() => window.top.document.querySelector('#frame1')"); Assert.Equal(frame, await elementHandle.GetContentFrameAsync()); }
public async Task ShouldWorkForCrossProcessIframes() { await Page.GoToAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.CrossProcessUrl + "/empty.html"); var elementHandle = await Page.QuerySelectorAsync("#frame1"); var frame = await elementHandle.GetContentFrameAsync(); Assert.Equal(Page.Frames[1], frame); }
public async Task ShouldThrowWhenDetached() { await Page.GoToAsync(TestConstants.EmptyPage); var frame1 = await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); await Page.EvalOnSelectorAsync("#frame1", "e => e.remove()"); var exception = await Assert.ThrowsAnyAsync <PlaywrightSharpException>(() => frame1.GetFrameElementAsync()); Assert.Equal("Frame has been detached.", exception.Message); }
public async Task ShouldThrowWhenFrameIsDetachedXPath() { await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); var frame = Page.FirstChildFrame(); var waitPromise = frame.WaitForSelectorAsync("//*[@class=\"box\"]"); await FrameUtils.DetachFrameAsync(Page, "frame1"); var exception = await Assert.ThrowsAnyAsync <Exception>(() => waitPromise); Assert.Contains("waitForFunction failed: frame got detached.", exception.Message); }
public async Task ShouldNotAllowCrossFrameElementHandlesWhenFramesDoNotScriptEachOther() { await Page.GoToAsync(TestConstants.EmptyPage); var frame = await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.CrossProcessUrl + "/empty.html"); var bodyHandle = await frame.QuerySelectorAsync("body"); var exception = await Assert.ThrowsAsync <PlaywrightSharpException>(() => Page.EvaluateAsync("body => body.innerHTML", bodyHandle)); Assert.Contains("Unable to adopt element handle from a different document", exception.Message); }
public async Task ShouldWorkWithContentFrame() { await Page.GoToAsync(TestConstants.EmptyPage); var frame = await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); var handle = await frame.GetFrameElementAsync(); var contentFrame = await handle.GetContentFrameAsync(); Assert.Same(contentFrame, frame); }
public async Task ShouldHaveDifferentExecutionContexts() { await Page.GoToAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); Assert.Equal(2, Page.Frames.Length); await Page.Frames[0].EvaluateAsync("() => window.FOO = 'foo'"); await Page.Frames[1].EvaluateAsync("() => window.FOO = 'bar'"); Assert.Equal("foo", await Page.Frames[0].EvaluateAsync <string>("() => window.FOO")); Assert.Equal("bar", await Page.Frames[1].EvaluateAsync <string>("() => window.FOO")); }
public async Task ShouldWorkForSubframeNavigationRequest() { var requests = new List <IRequest>(); Page.Request += (sender, e) => requests.Add(e.Request); await Page.GoToAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); Assert.Equal(2, requests.Count); Assert.Equal(Page.FirstChildFrame(), requests[1].Frame); }
public async Task ShouldTypeEmojiIntoAnIframe() { await Page.GoToAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "emoji-test", TestConstants.ServerUrl + "/input/textarea.html"); var frame = Page.Frames[1]; var textarea = await frame.QuerySelectorAsync("textarea"); await textarea.TypeAsync("👹 Tokyo street Japan 🇯🇵"); Assert.Equal("👹 Tokyo street Japan 🇯🇵", await frame.EvalOnSelectorAsync <string>("textarea", "textarea => textarea.value")); }
public async Task ShouldThrowWhenFrameIsDetached() { await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); var frame = Page.FirstChildFrame(); var waitTask = frame.WaitForSelectorAsync(".box").ContinueWith(task => task.Exception?.InnerException); await FrameUtils.DetachFrameAsync(Page, "frame1"); var waitException = await waitTask; Assert.NotNull(waitException); Assert.Contains("waitForFunction failed: frame got detached.", waitException.Message); }
public async Task ShouldReturnMatchingResponses() { await Page.GoToAsync(TestConstants.EmptyPage); // Attach three frames. var matchingData = new MatchingResponseData[] { new MatchingResponseData { FrameTask = FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage) }, new MatchingResponseData { FrameTask = FrameUtils.AttachFrameAsync(Page, "frame2", TestConstants.EmptyPage) }, new MatchingResponseData { FrameTask = FrameUtils.AttachFrameAsync(Page, "frame3", TestConstants.EmptyPage) } }; await TaskUtils.WhenAll(matchingData.Select(m => m.FrameTask)); // Navigate all frames to the same URL. var requestHandler = new RequestDelegate(async(context) => { if (int.TryParse(context.Request.Query["index"], out int index)) { await context.Response.WriteAsync(await matchingData[index].ServerResponseTcs.Task); } }); Server.SetRoute("/one-style.html?index=0", requestHandler); Server.SetRoute("/one-style.html?index=1", requestHandler); Server.SetRoute("/one-style.html?index=2", requestHandler); for (int i = 0; i < 3; ++i) { var waitRequestTask = Server.WaitForRequest("/one-style.html"); matchingData[i].NavigationTask = matchingData[i].FrameTask.Result.GoToAsync($"{TestConstants.ServerUrl}/one-style.html?index={i}"); await waitRequestTask; } // Respond from server out-of-order. string[] serverResponseTexts = new string[] { "AAA", "BBB", "CCC" }; for (int i = 0; i < 3; ++i) { matchingData[i].ServerResponseTcs.TrySetResult(serverResponseTexts[i]); var response = await matchingData[i].NavigationTask; Assert.Same(matchingData[i].FrameTask.Result, response.Frame); Assert.Equal(serverResponseTexts[i], await response.GetTextAsync()); } }
public async Task ShouldClickTheButtonInsideAnIframe() { await Page.GoToAsync(TestConstants.EmptyPage); await Page.SetContentAsync("<div style=\"width:100px;height:100px\">spacer</div>"); await FrameUtils.AttachFrameAsync(Page, "button-test", TestConstants.ServerUrl + "/input/button.html"); var frame = Page.FirstChildFrame(); var button = await frame.QuerySelectorAsync("button"); await button.ClickAsync(); Assert.Equal("Clicked", await frame.EvaluateAsync <string>("window.result")); }
public async Task ShouldReportFrameName() { await FrameUtils.AttachFrameAsync(Page, "theFrameId", TestConstants.EmptyPage); await Page.EvaluateAsync(@"url => { const frame = document.createElement('iframe'); frame.name = 'theFrameName'; frame.src = url; document.body.appendChild(frame); return new Promise(x => frame.onload = x); }", TestConstants.EmptyPage); Assert.Empty(Page.Frames[0].Name); Assert.Equal("theFrameId", Page.Frames[1].Name); Assert.Equal("theFrameName", Page.Frames[2].Name); }
public async Task PageWaitForSelectorAsyncIsShortcutForMainFrame() { await Page.GoToAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); var otherFrame = Page.FirstChildFrame(); var watchdog = Page.WaitForSelectorAsync("div", WaitForState.Attached); await otherFrame.EvaluateAsync(AddElement, "div"); await Page.EvaluateAsync(AddElement, "div"); var eHandle = await watchdog; Assert.Equal(Page.MainFrame, await eHandle.GetOwnerFrameAsync()); }
public async Task ShouldRunInSpecifiedFrameXPath() { await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame2", TestConstants.EmptyPage); var frame1 = Page.Frames.First(f => f.Name == "frame1"); var frame2 = Page.Frames.First(f => f.Name == "frame2"); var waitForXPathPromise = frame2.WaitForSelectorAsync("//div", WaitForState.Attached); await frame1.EvaluateAsync(AddElement, "div"); await frame2.EvaluateAsync(AddElement, "div"); var eHandle = await waitForXPathPromise; Assert.Equal(frame2, await eHandle.GetOwnerFrameAsync()); }
public async Task ShouldWorkInCrossProcessIframe() { await using var context = await Browser.NewContextAsync(new BrowserContextOptions { ColorScheme = ColorScheme.Dark, }); var page = await context.NewPageAsync(); await page.GoToAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(page, "frame1", TestConstants.CrossProcessHttpPrefix + "/empty.html"); var frame = page.Frames[1]; Assert.True(await frame.EvaluateAsync <bool>("() => matchMedia('(prefers-color-scheme: dark)').matches")); }
public async Task ShouldReportDifferentFrameInstanceWhenFrameReAttaches() { var frame1 = await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); await Page.EvaluateAsync(@"() => { window.frame = document.querySelector('#frame1'); window.frame.remove(); }"); Assert.True(frame1.IsDetached); var(frame2, _) = await TaskUtils.WhenAll( Page.WaitForEventAsync(PageEvent.FrameNavigated), Page.EvaluateAsync("() => document.body.appendChild(window.frame)") ); Assert.False(frame2.Frame.IsDetached); Assert.NotSame(frame1, frame2); }
public async Task ShouldClickTheButtonWithFixedPositionInsideAnIframe() { await Page.GoToAsync(TestConstants.EmptyPage); await Page.SetViewportSizeAsync(new ViewportSize { Width = 500, Height = 500 }); await Page.SetContentAsync("<div style=\"width:100px;height:2000px\">spacer</div>"); await FrameUtils.AttachFrameAsync(Page, "button-test", TestConstants.ServerUrl + "/input/button.html"); var frame = Page.FirstChildFrame(); await frame.EvalOnSelectorAsync("button", "button => button.style.setProperty('position', 'fixed')"); await frame.ClickAsync("button"); Assert.Equal("Clicked", await frame.EvaluateAsync <string>("window.result")); }
public async Task ShouldWorkForSubframes() { await using (var context = await Browser.NewContextAsync()) { var page = await context.NewPageAsync(); Assert.Contains("Mozilla", await page.EvaluateAsync <string>("navigator.userAgent")); } await using (var context = await Browser.NewContextAsync(new BrowserContextOptions { UserAgent = "foobar" })) { var page = await context.NewPageAsync(); var(userAgent, _) = await TaskUtils.WhenAll( Server.WaitForRequest <string>("/empty.html", (request) => request.Headers["user-agent"]), FrameUtils.AttachFrameAsync(page, "frame1", TestConstants.EmptyPage)); Assert.Equal("foobar", userAgent); } }
public async Task ShouldBeIsolatedBetweenFrames() { await Page.GoToAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); Assert.Equal(2, Page.Frames.Length); var frames = Page.Frames; Assert.NotSame(frames[0], frames[1]); await TaskUtils.WhenAll( frames[0].EvaluateAsync("() => window.a = 1"), frames[1].EvaluateAsync("() => window.a = 2") ); var(result1, result2) = await TaskUtils.WhenAll( frames[0].EvaluateAsync <int>("() => window.a"), frames[1].EvaluateAsync <int>("() => window.a") ); Assert.Equal(1, result1); Assert.Equal(2, result2); }