BrowserActionArgs

This commit is contained in:
Haiping Chen 2024-06-30 08:05:57 -05:00
parent 08ecff3ea5
commit 9003665f04
9 changed files with 29 additions and 25 deletions

View file

@ -4,7 +4,7 @@ namespace BotSharp.Abstraction.Browsing;
public interface IWebBrowser
{
Task<BrowserActionResult> LaunchBrowser(MessageInfo message);
Task<BrowserActionResult> LaunchBrowser(MessageInfo message, BrowserActionArgs args);
Task<BrowserActionResult> ScreenshotAsync(MessageInfo message, string path);
Task<BrowserActionResult> ScrollPage(MessageInfo message, PageActionArgs args);

View file

@ -2,5 +2,5 @@ namespace BotSharp.Abstraction.Browsing.Models;
public class BrowserActionArgs
{
public bool Headless { get; set; }
}

View file

@ -1,5 +1,6 @@
namespace BotSharp.Abstraction.Browsing.Models;
[Obsolete("This class is deprecated, use BrowserActionArgs instead.")]
public class BrowserActionParams
{
public Agent Agent { get; set; }

View file

@ -2,5 +2,5 @@ namespace BotSharp.Plugin.MetaAI.Settings;
public class MetaAiSettings
{
public fastTextSetting fastText { get; set; }
public fastTextSetting fastText { get; set; } = new();
}

View file

@ -1,4 +1,3 @@
using Microsoft.Playwright;
using System.IO;
namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver;
@ -21,33 +20,29 @@ public class PlaywrightInstance : IDisposable
public IPage GetPage(string id, string? pattern = null)
{
InitInstance(id).Wait();
return _contexts[id].Pages.LastOrDefault();
}
public async Task<IBrowserContext> InitInstance(string ctxId)
public async Task<IBrowserContext> GetContext(string ctxId)
{
return _contexts[ctxId];
}
public async Task<IBrowserContext> InitContext(string ctxId, BrowserActionArgs args)
{
if (_contexts.ContainsKey(ctxId))
return _contexts[ctxId];
if (_playwright == null)
{
_playwright = await Playwright.CreateAsync();
}
return await InitContext(ctxId);
}
public async Task<IBrowserContext> InitContext(string ctxId)
{
if (_contexts.ContainsKey(ctxId))
return _contexts[ctxId];
string tempFolderPath = $"{Path.GetTempPath()}\\playwright\\{ctxId}";
_contexts[ctxId] = await _playwright.Chromium.LaunchPersistentContextAsync(tempFolderPath, new BrowserTypeLaunchPersistentContextOptions
{
#if DEBUG
Headless = false,
#else
Headless = true,
#endif
Headless = args.Headless,
Channel = "chrome",
ViewportSize = new ViewportSize
{
@ -100,8 +95,13 @@ public class PlaywrightInstance : IDisposable
public async Task<IPage> NewPage(string ctxId, DataFetched? fetched)
{
await InitContext(ctxId);
var page = await _contexts[ctxId].NewPageAsync();
var context = await GetContext(ctxId);
var page = await context.NewPageAsync();
// 许多网站为了防止信息被爬取,会添加一些防护手段。其中之一是检测 window.navigator.webdriver 属性。
// 当使用 Playwright 打开浏览器时,该属性会被设置为 true从而被网站识别为自动化工具。通过以下方式屏蔽这个属性让网站无法识别是否使用了 Playwright
var js = @"Object.defineProperties(navigator, {webdriver:{get:()=>false}});";
await page.AddInitScriptAsync(js);
if (fetched != null)
{

View file

@ -7,7 +7,7 @@ public partial class PlaywrightWebDriver
public async Task<BrowserActionResult> GoToPage(MessageInfo message, PageActionArgs args)
{
var result = new BrowserActionResult();
var context = await _instance.InitInstance(message.ContextId);
var context = await _instance.GetContext(message.ContextId);
try
{
// Check if the page is already open

View file

@ -2,9 +2,9 @@ namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver;
public partial class PlaywrightWebDriver
{
public async Task<BrowserActionResult> LaunchBrowser(MessageInfo message)
public async Task<BrowserActionResult> LaunchBrowser(MessageInfo message, BrowserActionArgs args)
{
var context = await _instance.InitInstance(message.ContextId);
var context = await _instance.InitContext(message.ContextId, args);
var result = new BrowserActionResult
{
IsSuccess = context.Pages.Count > 0

View file

@ -2,7 +2,7 @@ namespace BotSharp.Plugin.WebDriver.Drivers.SeleniumDriver;
public partial class SeleniumWebDriver
{
public async Task<BrowserActionResult> LaunchBrowser(MessageInfo message)
public async Task<BrowserActionResult> LaunchBrowser(MessageInfo message, BrowserActionArgs args)
{
var context = await _instance.InitInstance(message.ContextId);
var result = new BrowserActionResult()

View file

@ -31,7 +31,10 @@ public class OpenBrowserFn : IFunctionCallback
ContextId = convService.ConversationId,
MessageId = message.MessageId
};
var result = await _browser.LaunchBrowser(msgInfo);
var result = await _browser.LaunchBrowser(msgInfo, new BrowserActionArgs
{
Headless = false
});
result = await _browser.GoToPage(msgInfo, new PageActionArgs
{
Url = url