diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/Enums/BroswerActionEnum.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/Enums/BroswerActionEnum.cs index abdfd67b3..4efa14480 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/Enums/BroswerActionEnum.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/Enums/BroswerActionEnum.cs @@ -7,5 +7,7 @@ public enum BroswerActionEnum Typing = 3, Hover = 4, Scroll = 5, - DragAndDrop = 6 + DragAndDrop = 6, + DropDown = 7, + FileUpload = 8 } diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/ElementActionArgs.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/ElementActionArgs.cs index 8885feb34..869186b18 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/ElementActionArgs.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/ElementActionArgs.cs @@ -12,6 +12,8 @@ public class ElementActionArgs [JsonPropertyName("content")] public string? Content { get; set; } + [JsonPropertyName("file_urls")] + public string[] FileUrl { get; set; } public ElementPosition? Position { get; set; } diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs index b851cd1ae..865864a06 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs @@ -1,3 +1,6 @@ +using System.IO; +using System.Net.Http; + namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver; public partial class PlaywrightWebDriver @@ -50,6 +53,18 @@ await locator.ClickAsync(new LocatorClickOptions }); } } + else if (action.Action == BroswerActionEnum.DropDown) + { + await locator.ClickAsync(); + var optionLocator = page.Locator($"//div[text()='{action.Content}']"); + var optionCount = await optionLocator.CountAsync(); ; + if (optionCount == 0) + { + Serilog.Log.Error($"Dropdown option not found: {action.Content}"); + return; + } + await optionLocator.First.ClickAsync(); + } else if (action.Action == BroswerActionEnum.InputText) { await locator.FillAsync(action.Content); @@ -63,6 +78,36 @@ await locator.ClickAsync(new LocatorClickOptions await locator.PressAsync(action.PressKey); } } + else if (action.Action == BroswerActionEnum.FileUpload) + { + if (action.FileUrl.Length == 0) + { + return; + } + var fileChooser = await page.RunAndWaitForFileChooserAsync(async () => + { + await locator.ClickAsync(); + }); + var guid = Guid.NewGuid().ToString(); + var directory = Path.Combine(Path.GetTempPath(), guid); + if (Directory.Exists(directory)) + { + Directory.Delete(directory, true); + } + Directory.CreateDirectory(directory); + var localPaths = new List(); + using var httpClient = new HttpClient(); + foreach (var fileUrl in action.FileUrl) + { + var bytes = await httpClient.GetByteArrayAsync(fileUrl); + var fileName = new Uri(fileUrl).AbsolutePath; + var localPath = Path.Combine(directory, Path.GetFileName(fileName)); + await File.WriteAllBytesAsync(localPath, bytes); + await Task.Delay(2000); + localPaths.Add(localPath); + } + await fileChooser.SetFilesAsync(localPaths); + } else if (action.Action == BroswerActionEnum.Typing) { await locator.PressSequentiallyAsync(action.Content); @@ -128,7 +173,6 @@ await locator.ClickAsync(new LocatorClickOptions await Task.Delay(1000 * action.WaitTime); } } - public static List GetVelocityTrack(float distance) { // Initialize the track list to store the movement distances diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-web-action_on_element.json b/src/Plugins/BotSharp.Plugin.WebDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-web-action_on_element.json index f91425b48..b397fc49e 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-web-action_on_element.json +++ b/src/Plugins/BotSharp.Plugin.WebDriver/data/agents/6745151e-6d46-4a02-8de4-1c4f21c7da95/functions/util-web-action_on_element.json @@ -11,12 +11,20 @@ "action": { "type": "string", "description": "action to perform on element", - "enum": [ "Click", "InputText" ] + "enum": [ "Click", "InputText", "DropDown", "FileUpload" ] }, "content": { "type": "string", "description": "content to input in element" }, + "file_urls": { + "type": "array", + "description": "The output format must be string array of file urls.", + "items": { + "type": "string", + "description": "file url" + } + }, "press_key": { "type": "string", "enum": [ "Enter" ],