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 45c42089c..201fe7c3c 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs @@ -55,15 +55,23 @@ 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) + var tagName = await locator.EvaluateAsync("el => el.tagName.toLowerCase()"); + if (tagName == "select") { - Serilog.Log.Error($"Dropdown option not found: {action.Content}"); - return; + await HandleSelectDropDownAsync(page, locator, action); + } + else + { + 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(); } - await optionLocator.First.ClickAsync(); } else if (action.Action == BroswerActionEnum.InputText) { @@ -247,4 +255,29 @@ public static List GetVelocityTrack(float distance) return track; } + + private async Task HandleSelectDropDownAsync(IPage page, ILocator locator, ElementActionArgs action) + { + if (string.IsNullOrWhiteSpace(action.Content)) + { + throw new InvalidOperationException("Dropdown target option (action.Content) cannot be null or empty when using a