diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs
index 54707cec..098b9538 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/PageActionArgs.cs
@@ -15,10 +15,19 @@ public class PageActionArgs
/// This value has to be set to true if you want to get the page XHR/ Fetch responses
///
public bool OpenNewTab { get; set; } = false;
+
+ public bool EnableResponseCallback { get; set; } = false;
+
///
/// Exclude urls for XHR/ Fetch responses
///
public string[]? ExcludeResponseUrls { get; set; }
+
+ ///
+ /// Only include urls for XHR/ Fetch responses
+ ///
+ public string[]? IncludeResponseUrls { get; set; }
+
public bool UseExistingPage { get; set; } = false;
public bool WaitForNetworkIdle { get; set; } = true;
diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs
index 65b45013..cd6daa34 100644
--- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs
+++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs
@@ -117,7 +117,7 @@ public class PlaywrightInstance : IDisposable
return _contexts[ctxId];
}
- public async Task NewPage(MessageInfo message, string[]? excludeResponseUrls = null)
+ public async Task NewPage(MessageInfo message, bool enableResponseCallback = false, string[]? excludeResponseUrls = null, string[]? includeResponseUrls = null)
{
var context = await GetContext(message.ContextId);
var page = await context.NewPageAsync();
@@ -127,13 +127,19 @@ public class PlaywrightInstance : IDisposable
var js = @"Object.defineProperties(navigator, {webdriver:{get:()=>false}});";
await page.AddInitScriptAsync(js);
+ if (!enableResponseCallback)
+ {
+ return page;
+ }
+
page.Response += async (sender, e) =>
{
if (e.Status != 204 &&
e.Headers.ContainsKey("content-type") &&
e.Headers["content-type"].Contains("application/json") &&
(e.Request.ResourceType == "fetch" || e.Request.ResourceType == "xhr") &&
- (excludeResponseUrls == null || !excludeResponseUrls.Any(url => e.Url.ToLower().Contains(url))))
+ (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}");
JsonElement? json = null;
@@ -160,7 +166,7 @@ public class PlaywrightInstance : IDisposable
}
catch (Exception ex)
{
- Serilog.Log.Error(ex.ToString());
+ Serilog.Log.Error($"{e.Url}\r\n" + ex.ToString());
}
}
};
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 5ddbfcbd..40f617d2 100644
--- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs
+++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GoToPage.cs
@@ -10,7 +10,9 @@ public partial class PlaywrightWebDriver
{
var page = args.UseExistingPage ?
_instance.GetPage(message.ContextId, pattern: args.Url) :
- await _instance.NewPage(message, excludeResponseUrls: args.ExcludeResponseUrls);
+ await _instance.NewPage(message, enableResponseCallback: args.EnableResponseCallback,
+ excludeResponseUrls: args.ExcludeResponseUrls,
+ includeResponseUrls: args.IncludeResponseUrls);
if (args.UseExistingPage && page != null && page.Url == args.Url)
{
@@ -23,7 +25,9 @@ public partial class PlaywrightWebDriver
if (args.UseExistingPage && args.OpenNewTab && page != null && page.Url == "about:blank")
{
- page = await _instance.NewPage(message, excludeResponseUrls: args.ExcludeResponseUrls);
+ page = await _instance.NewPage(message, enableResponseCallback: args.EnableResponseCallback,
+ excludeResponseUrls: args.ExcludeResponseUrls,
+ includeResponseUrls: args.IncludeResponseUrls);
}
var response = await page.GotoAsync(args.Url, new PageGotoOptions