diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs index f14e4bdc..bf58a5ac 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs @@ -108,12 +108,7 @@ public class PlaywrightInstance : IDisposable return _contexts[ctxId]; } - public async Task NewPage(MessageInfo message, - bool enableResponseCallback = false, - bool responseInMemory = false, - List? responseContainer = null, - string[]? excludeResponseUrls = null, - string[]? includeResponseUrls = null) + public async Task NewPage(MessageInfo message, PageActionArgs args) { var context = await GetContext(message.ContextId); var page = await context.NewPageAsync(); @@ -123,70 +118,75 @@ public class PlaywrightInstance : IDisposable var js = @"Object.defineProperties(navigator, {webdriver:{get:()=>false}});"; await page.AddInitScriptAsync(js); - if (!enableResponseCallback) + if (!args.EnableResponseCallback) { return page; } page.Response += async (sender, e) => { - if (e.Status != 204 && - e.Headers.ContainsKey("content-type") && - (e.Request.ResourceType == "fetch" || e.Request.ResourceType == "xhr") && - (excludeResponseUrls == null || !excludeResponseUrls.Any(url => e.Url.ToLower().Contains(url))) && - (includeResponseUrls == null || includeResponseUrls.Any(url => e.Url.ToLower().Contains(url)))) - { - Serilog.Log.Information($"{e.Request.Method}: {e.Url}"); - - try - { - var result = new WebPageResponseData - { - Url = e.Url.ToLower(), - PostData = e.Request?.PostData ?? string.Empty, - ResponseInMemory = responseInMemory - }; - - if (e.Headers["content-type"].Contains("application/json")) - { - if (e.Status == 200 && e.Ok) - { - var json = await e.JsonAsync(); - result.ResponseData = JsonSerializer.Serialize(json); - } - } - else - { - var html = await e.TextAsync(); - result.ResponseData = html; - } - - if (responseContainer != null && responseInMemory) - { - responseContainer.Add(result); - } - - Serilog.Log.Warning($"Response status: {e.Status} {e.StatusText}, OK: {e.Ok}"); - var webPageResponseHooks = _services.GetServices(); - foreach (var hook in webPageResponseHooks) - { - hook.OnDataFetched(message, result); - } - } - catch (ObjectDisposedException ex) - { - Serilog.Log.Information(ex.Message); - } - catch (Exception ex) - { - Serilog.Log.Error($"{e.Url}\r\n" + ex.ToString()); - } - } + await HandleFetchResponse(e, message, args); }; return page; } + public async Task HandleFetchResponse(IResponse response, MessageInfo message, PageActionArgs args) + { + if (response.Status != 204 && + response.Headers.ContainsKey("content-type") && + (response.Request.ResourceType == "fetch" || response.Request.ResourceType == "xhr") && + (args.ExcludeResponseUrls == null || !args.ExcludeResponseUrls.Any(url => response.Url.ToLower().Contains(url))) && + (args.IncludeResponseUrls == null || args.IncludeResponseUrls.Any(url => response.Url.ToLower().Contains(url)))) + { + Serilog.Log.Information($"{response.Request.Method}: {response.Url}"); + + try + { + var result = new WebPageResponseData + { + Url = response.Url.ToLower(), + PostData = response.Request?.PostData ?? string.Empty, + ResponseInMemory = args.ResponseInMemory + }; + + if (response.Headers["content-type"].Contains("application/json")) + { + if (response.Status == 200 && response.Ok) + { + var json = await response.JsonAsync(); + result.ResponseData = JsonSerializer.Serialize(json); + } + } + else + { + var html = await response.TextAsync(); + result.ResponseData = html; + } + + if (args.ResponseContainer != null && args.ResponseInMemory) + { + args.ResponseContainer.Add(result); + } + + Serilog.Log.Warning($"Response status: {response.Status} {response.StatusText}, OK: {response.Ok}"); + var webPageResponseHooks = _services.GetServices(); + foreach (var hook in webPageResponseHooks) + { + hook.OnDataFetched(message, result); + } + } + catch (ObjectDisposedException ex) + { + Serilog.Log.Information(ex.Message); + } + catch (Exception ex) + { + Serilog.Log.Error($"{response.Url}\r\n" + ex.ToString()); + } + } + } + /// /// Wait page and network until timeout in seconds /// diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs index 0a0a5425..7f0501cf 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs @@ -9,39 +9,40 @@ public partial class PlaywrightWebDriver try { IPage? page = null; - if (!args.OpenNewTab && !args.EnableResponseCallback) + if (!args.OpenNewTab) { page = _instance.Contexts[message.ContextId].Pages.LastOrDefault(); + + if (page != null) + { + await page.EvaluateAsync(@"() => { + window.open('', '_blank'); + }"); + + if (args.EnableResponseCallback) + { + page.Response += async (sender, e) => + { + await _instance.HandleFetchResponse(e, message, args); + }; + } + } } else { - page = await _instance.NewPage(message, enableResponseCallback: args.EnableResponseCallback, - responseInMemory: args.ResponseInMemory, - responseContainer: args.ResponseContainer, - excludeResponseUrls: args.ExcludeResponseUrls, - includeResponseUrls: args.IncludeResponseUrls); + page = await _instance.NewPage(message, args); Serilog.Log.Information($"goto page: {args.Url}"); if (args.OpenNewTab && page != null && page.Url == "about:blank") { - page = await _instance.NewPage(message, - enableResponseCallback: args.EnableResponseCallback, - responseInMemory: args.ResponseInMemory, - responseContainer: args.ResponseContainer, - excludeResponseUrls: args.ExcludeResponseUrls, - includeResponseUrls: args.IncludeResponseUrls); + page = await _instance.NewPage(message, args); } } if (page == null) { - page = await _instance.NewPage(message, - enableResponseCallback: args.EnableResponseCallback, - responseInMemory: args.ResponseInMemory, - responseContainer: args.ResponseContainer, - excludeResponseUrls: args.ExcludeResponseUrls, - includeResponseUrls: args.IncludeResponseUrls); + page = await _instance.NewPage(message, args); } // Active current tab