public async Task ShouldReturnNullForDocumentDocumentElement() { await Page.GotoAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); var frame = Page.Frames.ElementAt(1); var elementHandle = (IElementHandle)await frame.EvaluateHandleAsync("() => document.documentElement"); Assert.Null(await elementHandle.ContentFrameAsync()); }
public async Task ShouldWorkForDocument() { await Page.GotoAsync(Server.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", Server.EmptyPage); var frame = Page.Frames.ElementAt(1); var elementHandle = (IElementHandle)await frame.EvaluateHandleAsync("() => document"); Assert.AreEqual(frame, await elementHandle.OwnerFrameAsync()); }
public async Task ShouldWorkForCrossProcessIframes() { await Page.GotoAsync(Server.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", Server.CrossProcessPrefix + "/empty.html"); var frame = Page.Frames.ElementAt(1); var elementHandle = (IElementHandle)await frame.EvaluateHandleAsync("() => document.body"); Assert.AreEqual(frame, await elementHandle.OwnerFrameAsync()); }
public async Task ShouldFireForIframes() { var requests = new List <IRequest>(); Page.Request += (_, e) => requests.Add(e); await Page.GoToAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); Assert.Equal(2, requests.Count); }
public async Task ShouldWorkForCrossFrameEvaluations() { await Page.GotoAsync(Server.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", Server.EmptyPage); var frame = Page.MainFrame; var elementHandle = (IElementHandle)await frame.EvaluateHandleAsync("() => document.querySelector('#frame1').contentWindow.document.body"); Assert.AreEqual(frame.ChildFrames.First(), await elementHandle.OwnerFrameAsync()); }
public async Task ShouldWork() { await Page.GoToAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); var frame = Page.Frames.ElementAt(1); var elementHandle = (IElementHandle)await frame.EvaluateHandleAsync("() => document.body"); Assert.Equal(frame, await elementHandle.OwnerFrameAsync()); }
public async Task ShouldWorkForCrossFrameEvaluations() { await Page.GotoAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); var frame = Page.Frames.ElementAt(1); var elementHandle = (IElementHandle)await frame.EvaluateHandleAsync("() => window.top.document.querySelector('#frame1')"); Assert.Equal(frame, await elementHandle.ContentFrameAsync()); }
public async Task ShouldWorkForIframeElements() { await Page.GotoAsync(Server.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", Server.EmptyPage); var frame = Page.MainFrame; var elementHandle = (IElementHandle)await frame.EvaluateHandleAsync("() => document.querySelector('#frame1')"); Assert.AreEqual(frame, await elementHandle.OwnerFrameAsync()); }
public async Task ShouldWork() { await Page.GotoAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); var elementHandle = await Page.QuerySelectorAsync("#frame1"); var frame = await elementHandle.ContentFrameAsync(); Assert.Equal(Page.Frames.ElementAt(1), frame); }
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 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.ContentFrameAsync(); Assert.Equal(Page.Frames.ElementAt(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 <PlaywrightException>(() => frame1.FrameElementAsync()); Assert.Equal("Frame has been detached.", exception.Message); }
public async Task ShouldNotAllowCrossFrameElementHandlesWhenFramesDoNotScriptEachOther() { await Page.GotoAsync(Server.EmptyPage); var frame = await FrameUtils.AttachFrameAsync(Page, "frame1", Server.CrossProcessPrefix + "/empty.html"); var bodyHandle = await frame.QuerySelectorAsync("body"); var exception = await PlaywrightAssert.ThrowsAsync <PlaywrightException>(() => Page.EvaluateAsync("body => body.innerHTML", bodyHandle)); StringAssert.Contains("Unable to adopt element handle from a different document", exception.Message); }
public async Task ShouldWorkForCrossProcessIframes() { await Page.GotoAsync(Server.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", Server.CrossProcessPrefix + "/empty.html"); var elementHandle = await Page.QuerySelectorAsync("#frame1"); var frame = await elementHandle.ContentFrameAsync(); Assert.AreEqual(Page.Frames.ElementAt(1), frame); }
public async Task ShouldWorkWithContentFrame() { await Page.GotoAsync(TestConstants.EmptyPage); var frame = await FrameUtils.AttachFrameAsync(Page, "frame1", TestConstants.EmptyPage); var handle = await frame.FrameElementAsync(); var contentFrame = await handle.ContentFrameAsync(); Assert.Same(contentFrame, frame); }
public async Task ShouldThrowWhenFrameIsDetachedXPath() { await FrameUtils.AttachFrameAsync(Page, "frame1", Server.EmptyPage); var frame = Page.FirstChildFrame(); var waitPromise = frame.WaitForSelectorAsync("//*[@class=\"box\"]"); await FrameUtils.DetachFrameAsync(Page, "frame1"); var exception = await PlaywrightAssert.ThrowsAsync <PlaywrightException>(() => waitPromise); StringAssert.Contains("Frame was detached", exception.Message); }
public async Task ShouldWorkWithContentFrame() { await Page.GotoAsync(Server.EmptyPage); var frame = await FrameUtils.AttachFrameAsync(Page, "frame1", Server.EmptyPage); var handle = await frame.FrameElementAsync(); var contentFrame = await handle.ContentFrameAsync(); Assert.AreEqual(contentFrame, frame); }
public async Task ShouldThrowWhenFrameIsDetached() { await FrameUtils.AttachFrameAsync(Page, "frame1", Server.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); StringAssert.Contains("Frame was detached", waitException.Message); }
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 ShouldTypeEmojiIntoAnIframe() { await Page.GoToAsync(TestConstants.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "emoji-test", TestConstants.ServerUrl + "/input/textarea.html"); var frame = Page.Frames.ElementAt(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 ShouldTypeEmojiIntoAnIframe() { await Page.GotoAsync(Server.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "emoji-test", Server.Prefix + "/input/textarea.html"); var frame = Page.Frames.ElementAt(1); var textarea = await frame.QuerySelectorAsync("textarea"); await textarea.TypeAsync("👹 Tokyo street Japan 🇯🇵"); Assert.AreEqual("👹 Tokyo street Japan 🇯🇵", await frame.EvalOnSelectorAsync <string>("textarea", "textarea => textarea.value")); }
public async Task ShouldWorkForSubframeNavigationRequest() { var requests = new List <IRequest>(); Page.Request += (_, e) => requests.Add(e); 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 ShouldHaveDifferentExecutionContexts() { await Page.GotoAsync(Server.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", Server.EmptyPage); Assert.AreEqual(2, Page.Frames.Count); await Page.Frames.First().EvaluateAsync("() => window.FOO = 'foo'"); await Page.Frames.ElementAt(1).EvaluateAsync("() => window.FOO = 'bar'"); Assert.AreEqual("foo", await Page.Frames.First().EvaluateAsync <string>("() => window.FOO")); Assert.AreEqual("bar", await Page.Frames.ElementAt(1).EvaluateAsync <string>("() => window.FOO")); }
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.TextAsync()); } }
public async Task ShouldClickTheButtonInsideAnIframe() { await Page.GotoAsync(Server.EmptyPage); await Page.SetContentAsync("<div style=\"width:100px;height:100px\">spacer</div>"); await FrameUtils.AttachFrameAsync(Page, "button-test", Server.Prefix + "/input/button.html"); var frame = Page.FirstChildFrame(); var button = await frame.QuerySelectorAsync("button"); await button.ClickAsync(); Assert.AreEqual("Clicked", await frame.EvaluateAsync <string>("window.result")); }
public async Task PageWaitForSelectorAsyncIsShortcutForMainFrame() { await Page.GotoAsync(Server.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame1", Server.EmptyPage); var otherFrame = Page.FirstChildFrame(); var watchdog = Page.WaitForSelectorAsync("div", new() { State = WaitForSelectorState.Attached }); await otherFrame.EvaluateAsync(AddElement, "div"); await Page.EvaluateAsync(AddElement, "div"); var eHandle = await watchdog; Assert.AreEqual(Page.MainFrame, await eHandle.OwnerFrameAsync()); }
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.First().Name); Assert.Equal("theFrameId", Page.Frames.ElementAt(1).Name); Assert.Equal("theFrameName", Page.Frames.ElementAt(2).Name); }
public async Task ShouldClickTheButtonWithFixedPositionInsideAnIframe() { await Page.GotoAsync(Server.EmptyPage); await Page.SetViewportSizeAsync(500, 500); await Page.SetContentAsync("<div style=\"width:100px;height:2000px\">spacer</div>"); await FrameUtils.AttachFrameAsync(Page, "button-test", Server.Prefix + "/input/button.html"); var frame = Page.FirstChildFrame(); await frame.EvalOnSelectorAsync("button", "button => button.style.setProperty('position', 'fixed')"); await frame.ClickAsync("button"); Assert.AreEqual("Clicked", await frame.EvaluateAsync <string>("window.result")); }
public async Task ShouldRunInSpecifiedFrame() { await FrameUtils.AttachFrameAsync(Page, "frame1", Server.EmptyPage); await FrameUtils.AttachFrameAsync(Page, "frame2", Server.EmptyPage); var frame1 = Page.FirstChildFrame(); var frame2 = Page.Frames.ElementAt(2); var waitForSelectorPromise = frame2.WaitForSelectorAsync("div", new() { State = WaitForSelectorState.Attached }); await frame1.EvaluateAsync(AddElement, "div"); await frame2.EvaluateAsync(AddElement, "div"); var eHandle = await waitForSelectorPromise; Assert.AreEqual(frame2, await eHandle.OwnerFrameAsync()); }
public async Task ShouldWorkInCrossProcessIframe() { await using var context = await Browser.NewContextAsync(new() { ColorScheme = ColorScheme.Dark, }); var page = await context.NewPageAsync(); await page.GotoAsync(Server.EmptyPage); await FrameUtils.AttachFrameAsync(page, "frame1", Server.CrossProcessPrefix + "/empty.html"); var frame = page.Frames.ElementAt(1); Assert.True(await frame.EvaluateAsync <bool>("() => matchMedia('(prefers-color-scheme: dark)').matches")); }