Add EnableResponseCallback

This commit is contained in:
Haiping Chen 2024-08-12 09:43:39 -05:00
parent 2be4dd3053
commit 5b041b19e5
3 changed files with 24 additions and 5 deletions

View file

@ -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
/// </summary>
public bool OpenNewTab { get; set; } = false;
public bool EnableResponseCallback { get; set; } = false;
/// <summary>
/// Exclude urls for XHR/ Fetch responses
/// </summary>
public string[]? ExcludeResponseUrls { get; set; }
/// <summary>
/// Only include urls for XHR/ Fetch responses
/// </summary>
public string[]? IncludeResponseUrls { get; set; }
public bool UseExistingPage { get; set; } = false;
public bool WaitForNetworkIdle { get; set; } = true;

View file

@ -117,7 +117,7 @@ public class PlaywrightInstance : IDisposable
return _contexts[ctxId];
}
public async Task<IPage> NewPage(MessageInfo message, string[]? excludeResponseUrls = null)
public async Task<IPage> 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());
}
}
};

View file

@ -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