Add screenshots.

This commit is contained in:
Haiping Chen 2024-02-06 08:07:09 -06:00
parent 4a1ae030dd
commit c84da67ab6
17 changed files with 96 additions and 9 deletions

View file

@ -3,6 +3,7 @@ namespace BotSharp.Plugin.WebDriver.Drivers;
public interface IWebBrowser
{
Task LaunchBrowser(string? url);
Task<string> ScreenshotAsync(string path);
Task<bool> InputUserText(BrowserActionParams actionParams);
Task<bool> InputUserPassword(BrowserActionParams actionParams);
Task<bool> ClickButton(BrowserActionParams actionParams);

View file

@ -32,7 +32,7 @@ public class PlaywrightInstance : IDisposable
string tempFolderPath = $"{Path.GetTempPath()}\\playwright\\{Guid.NewGuid()}";
_context = await _playwright.Chromium.LaunchPersistentContextAsync(tempFolderPath, new BrowserTypeLaunchPersistentContextOptions
{
Headless = false,
Headless = true,
Channel = "chrome",
IgnoreDefaultArgs = new[]
{

View file

@ -1,4 +1,3 @@
using Microsoft.Extensions.Logging;
namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver;
@ -6,7 +5,9 @@ public partial class PlaywrightWebDriver
{
public async Task CloseBrowser()
{
// await _instance.Browser.CloseAsync();
_logger.LogInformation($"Closed browser with page {_instance.Page.Url}");
if (_instance.Context != null)
{
await _instance.Context.CloseAsync();
}
}
}

View file

@ -5,6 +5,9 @@ public partial class PlaywrightWebDriver
public async Task<string> ExtractData(BrowserActionParams actionParams)
{
await _instance.Page.WaitForLoadStateAsync(LoadState.DOMContentLoaded);
await _instance.Page.WaitForLoadStateAsync(LoadState.NetworkIdle);
await Task.Delay(3000);
// Retrieve the page raw html and infer the element path
var body = await _instance.Page.QuerySelectorAsync("body");

View file

@ -0,0 +1,15 @@
namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver;
public partial class PlaywrightWebDriver
{
public async Task<string> ScreenshotAsync(string path)
{
var bytes = await _instance.Page.ScreenshotAsync(new PageScreenshotOptions
{
Path = path,
});
return Convert.ToBase64String(bytes);
}
}

View file

@ -24,6 +24,11 @@ public class ChangeCheckboxFn : IFunctionCallback
message.Content = result ? "Success" : "Failed";
var webDriverService = _services.GetRequiredService<WebDriverService>();
var path = webDriverService.NewScreenshotFilePath(message.MessageId);
message.Data = await _browser.ScreenshotAsync(path);
return true;
}
}

View file

@ -23,7 +23,12 @@ public class ChangeListValueFn : IFunctionCallback
var result = await _browser.ChangeListValue(new BrowserActionParams(agent, args, message.MessageId));
message.Content = result ? "Success" : "Failed";
var webDriverService = _services.GetRequiredService<WebDriverService>();
var path = webDriverService.NewScreenshotFilePath(message.MessageId);
message.Data = await _browser.ScreenshotAsync(path);
return true;
}
}

View file

@ -24,6 +24,11 @@ public class CheckRadioButtonFn : IFunctionCallback
message.Content = result ? "Success" : "Failed";
var webDriverService = _services.GetRequiredService<WebDriverService>();
var path = webDriverService.NewScreenshotFilePath(message.MessageId);
message.Data = await _browser.ScreenshotAsync(path);
return true;
}
}

View file

@ -24,6 +24,11 @@ public class ClickButtonFn : IFunctionCallback
message.Content = result ? "Success" : "Failed";
var webDriverService = _services.GetRequiredService<WebDriverService>();
var path = webDriverService.NewScreenshotFilePath(message.MessageId);
message.Data = await _browser.ScreenshotAsync(path);
return true;
}
}

View file

@ -24,6 +24,11 @@ public class ClickElementFn : IFunctionCallback
message.Content = result ? "Success" : "Failed";
var webDriverService = _services.GetRequiredService<WebDriverService>();
var path = webDriverService.NewScreenshotFilePath(message.MessageId);
message.Data = await _browser.ScreenshotAsync(path);
return true;
}
}

View file

@ -20,6 +20,12 @@ public class ExtractDataFn : IFunctionCallback
var agentService = _services.GetRequiredService<IAgentService>();
var agent = await agentService.LoadAgent(message.CurrentAgentId);
message.Content = await _browser.ExtractData(new BrowserActionParams(agent, args, message.MessageId));
var webDriverService = _services.GetRequiredService<WebDriverService>();
var path = webDriverService.NewScreenshotFilePath(message.MessageId);
message.Data = await _browser.ScreenshotAsync(path);
return true;
}
}

View file

@ -21,6 +21,12 @@ public class GoToPageFn : IFunctionCallback
var agent = await agentService.LoadAgent(message.CurrentAgentId);
await _browser.GoToPage(new BrowserActionParams(agent, args, message.MessageId));
message.Content = $"Page {args.Url} is open.";
var webDriverService = _services.GetRequiredService<WebDriverService>();
var path = webDriverService.NewScreenshotFilePath(message.MessageId);
message.Data = await _browser.ScreenshotAsync(path);
return true;
}
}

View file

@ -24,6 +24,11 @@ public class InputUserPasswordFn : IFunctionCallback
message.Content = result ? "Success" : "Failed";
var webDriverService = _services.GetRequiredService<WebDriverService>();
var path = webDriverService.NewScreenshotFilePath(message.MessageId);
message.Data = await _browser.ScreenshotAsync(path);
return true;
}
}

View file

@ -24,6 +24,11 @@ public class InputUserTextFn : IFunctionCallback
message.Content = result ? "Success" : "Failed";
var webDriverService = _services.GetRequiredService<WebDriverService>();
var path = webDriverService.NewScreenshotFilePath(message.MessageId);
message.Data = await _browser.ScreenshotAsync(path);
return true;
}
}

View file

@ -19,6 +19,12 @@ public class OpenBrowserFn : IFunctionCallback
var args = JsonSerializer.Deserialize<BrowsingContextIn>(message.FunctionArgs);
await _browser.LaunchBrowser(args.Url);
message.Content = string.IsNullOrEmpty(args.Url) ? $"Launch browser with blank page successfully." : $"Open website {args.Url} successfully.";
var webDriverService = _services.GetRequiredService<WebDriverService>();
var path = webDriverService.NewScreenshotFilePath(message.MessageId);
message.Data = await _browser.ScreenshotAsync(path);
return true;
}
}

View file

@ -0,0 +1,18 @@
using System.IO;
namespace BotSharp.Plugin.WebDriver.Services;
public partial class WebDriverService
{
public string NewScreenshotFilePath(string messageId)
{
var conversation = _services.GetRequiredService<IConversationService>();
var agentService = _services.GetRequiredService<IAgentService>();
var dir = $"{agentService.GetDataDir()}/conversations/{conversation.ConversationId}/screenshots";
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
return $"{dir}/{messageId}.png";
}
}

View file

@ -1,7 +1,3 @@
using BotSharp.Abstraction.Agents.Enums;
using BotSharp.Abstraction.MLTasks;
using BotSharp.Core.Infrastructures;
namespace BotSharp.Plugin.WebDriver.Services;
public partial class WebDriverService