window.open('', '_blank')

This commit is contained in:
Haiping Chen 2024-12-29 19:16:39 +00:00
parent 68df1f14c4
commit 01fac40982
2 changed files with 78 additions and 77 deletions

View file

@ -108,12 +108,7 @@ public class PlaywrightInstance : IDisposable
return _contexts[ctxId];
}
public async Task<IPage> NewPage(MessageInfo message,
bool enableResponseCallback = false,
bool responseInMemory = false,
List<WebPageResponseData>? responseContainer = null,
string[]? excludeResponseUrls = null,
string[]? includeResponseUrls = null)
public async Task<IPage> 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<IWebPageResponseHook>();
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<IWebPageResponseHook>();
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());
}
}
}
/// <summary>
/// Wait page and network until timeout in seconds
/// </summary>

View file

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