Skip to content

Commit 1992a70

Browse files
authored
Merge pull request #411 from Qtoss-Alpha/master
Optimize WebDriver with context id.
2 parents 887619d + db709b2 commit 1992a70

27 files changed

+111
-85
lines changed

src/Infrastructure/BotSharp.Abstraction/Browsing/IWebBrowser.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ namespace BotSharp.Abstraction.Browsing;
44

55
public interface IWebBrowser
66
{
7-
Task<BrowserActionResult> LaunchBrowser(string conversationId, string? url);
8-
Task<BrowserActionResult> ScreenshotAsync(string conversationId, string path);
7+
Task<BrowserActionResult> LaunchBrowser(string contextId, string? url, bool openIfNotExist = true);
8+
Task<BrowserActionResult> ScreenshotAsync(string contextId, string path);
99
Task<BrowserActionResult> ScrollPageAsync(BrowserActionParams actionParams);
1010

1111
Task<BrowserActionResult> ActionOnElement(MessageInfo message, ElementLocatingArgs location, ElementActionArgs action);
@@ -19,10 +19,11 @@ public interface IWebBrowser
1919
Task<BrowserActionResult> ChangeListValue(BrowserActionParams actionParams);
2020
Task<BrowserActionResult> CheckRadioButton(BrowserActionParams actionParams);
2121
Task<BrowserActionResult> ChangeCheckbox(BrowserActionParams actionParams);
22-
Task<BrowserActionResult> GoToPage(string conversationId, string url);
22+
Task<BrowserActionResult> GoToPage(string contextId, string url, bool openNewTab = false);
2323
Task<string> ExtractData(BrowserActionParams actionParams);
24-
Task<T> EvaluateScript<T>(string conversationId, string script);
25-
Task CloseBrowser(string conversationId);
26-
Task<BrowserActionResult> SendHttpRequest(HttpRequestParams actionParams);
24+
Task<T> EvaluateScript<T>(string contextId, string script);
25+
Task CloseBrowser(string contextId);
26+
Task CloseCurrentPage(string contextId);
27+
Task<BrowserActionResult> SendHttpRequest(string contextId, HttpRequestParams actionParams);
2728
Task<string> GetAttributeValue(MessageInfo message, ElementLocatingArgs location, BrowserActionResult result);
2829
}

src/Infrastructure/BotSharp.Abstraction/Browsing/Models/BrowserActionParams.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ public class BrowserActionParams
44
{
55
public Agent Agent { get; set; }
66
public BrowsingContextIn Context { get; set; }
7-
public string ConversationId { get; set; }
7+
public string ContextId { get; set; }
88
public string MessageId { get; set; }
99

10-
public BrowserActionParams(Agent agent, BrowsingContextIn context, string conversationId, string messageId)
10+
public BrowserActionParams(Agent agent, BrowsingContextIn context, string contextId, string messageId)
1111
{
1212
Agent = agent;
1313
Context = context;
14-
ConversationId = conversationId;
14+
ContextId = contextId;
1515
MessageId = messageId;
1616
}
1717
}

src/Infrastructure/BotSharp.Abstraction/Browsing/Models/MessageInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ namespace BotSharp.Abstraction.Browsing.Models;
33
public class MessageInfo
44
{
55
public string AgentId { get; set; }
6-
public string ConversationId { get; set; }
6+
public string ContextId { get; set; }
77
public string MessageId { get; set; }
88
}

src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,30 @@ public class PlaywrightInstance : IDisposable
66
{
77
IPlaywright _playwright;
88
Dictionary<string, IBrowserContext> _contexts = new Dictionary<string, IBrowserContext>();
9+
public Dictionary<string, IBrowserContext> Contexts => _contexts;
910

1011
public IPage GetPage(string id)
1112
{
1213
InitInstance(id).Wait();
1314
return _contexts[id].Pages.LastOrDefault();
1415
}
1516

16-
public async Task InitInstance(string id)
17+
public async Task<IBrowserContext> InitInstance(string id)
1718
{
1819
if (_playwright == null)
1920
{
2021
_playwright = await Playwright.CreateAsync();
2122
}
22-
await InitContext(id);
23+
return await InitContext(id);
2324
}
2425

25-
public async Task InitContext(string id)
26+
public async Task<IBrowserContext> InitContext(string id)
2627
{
2728
if (_contexts.ContainsKey(id))
28-
return;
29-
#if DEBUG
30-
string tempFolderPath = $"{Path.GetTempPath()}\\playwright";
31-
#else
29+
return _contexts[id];
30+
3231
string tempFolderPath = $"{Path.GetTempPath()}\\playwright\\{id}";
33-
#endif
32+
3433
_contexts[id] = await _playwright.Chromium.LaunchPersistentContextAsync(tempFolderPath, new BrowserTypeLaunchPersistentContextOptions
3534
{
3635
#if DEBUG
@@ -65,6 +64,8 @@ public async Task InitContext(string id)
6564
Serilog.Log.Warning($"Playwright browser context is closed");
6665
_contexts.Remove(id);
6766
};
67+
68+
return _contexts[id];
6869
}
6970

7071
public async Task<IPage> NewPage(string id)
@@ -92,6 +93,14 @@ public async Task Close(string id)
9293
}
9394
}
9495

96+
public async Task CloseCurrentPage(string id)
97+
{
98+
if (_contexts.ContainsKey(id))
99+
{
100+
await GetPage(id).CloseAsync();
101+
}
102+
}
103+
95104
public void Dispose()
96105
{
97106
_contexts.Clear();

src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.ActionOnElement.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ public partial class PlaywrightWebDriver
44
{
55
public async Task<BrowserActionResult> ActionOnElement(MessageInfo message, ElementLocatingArgs location, ElementActionArgs action)
66
{
7-
await _instance.Wait(message.ConversationId);
7+
await _instance.Wait(message.ContextId);
88
var result = await LocateElement(message, location);
99
if (result.IsSuccess)
1010
{

src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.ChangeCheckbox.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
using System.Text.RegularExpressions;
2-
31
namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver;
42

53
public partial class PlaywrightWebDriver
@@ -8,7 +6,7 @@ public async Task<BrowserActionResult> ChangeCheckbox(BrowserActionParams action
86
{
97
var result = new BrowserActionResult();
108

11-
await _instance.Wait(actionParams.ConversationId);
9+
await _instance.Wait(actionParams.ContextId);
1210

1311
// Retrieve the page raw html and infer the element path
1412
var regexExpression = actionParams.Context.MatchRule.ToLower() switch
@@ -19,7 +17,7 @@ public async Task<BrowserActionResult> ChangeCheckbox(BrowserActionParams action
1917
_ => $"^{actionParams.Context.ElementText}$"
2018
};
2119
var regex = new Regex(regexExpression, RegexOptions.IgnoreCase);
22-
var elements = _instance.GetPage(actionParams.ConversationId).GetByText(regex);
20+
var elements = _instance.GetPage(actionParams.ContextId).GetByText(regex);
2321
var count = await elements.CountAsync();
2422

2523
var errorMessage = $"Can't locate element by keyword {actionParams.Context.ElementText}";
@@ -55,7 +53,7 @@ public async Task<BrowserActionResult> ChangeCheckbox(BrowserActionParams action
5553
}
5654
else
5755
{
58-
elements = _instance.GetPage(actionParams.ConversationId).Locator($"#{id}");
56+
elements = _instance.GetPage(actionParams.ContextId).Locator($"#{id}");
5957
}
6058
count = await elements.CountAsync();
6159

src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.ChangeListValue.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ public partial class PlaywrightWebDriver
55
public async Task<BrowserActionResult> ChangeListValue(BrowserActionParams actionParams)
66
{
77
var result = new BrowserActionResult();
8-
await _instance.Wait(actionParams.ConversationId);
8+
await _instance.Wait(actionParams.ContextId);
99

1010
// Retrieve the page raw html and infer the element path
11-
var body = await _instance.GetPage(actionParams.ConversationId).QuerySelectorAsync("body");
11+
var body = await _instance.GetPage(actionParams.ContextId).QuerySelectorAsync("body");
1212

1313
var str = new List<string>();
1414
var inputs = await body.QuerySelectorAllAsync("select");
@@ -61,7 +61,7 @@ public async Task<BrowserActionResult> ChangeListValue(BrowserActionParams actio
6161
string.Join("", str),
6262
actionParams.Context.ElementName,
6363
actionParams.MessageId);
64-
ILocator element = Locator(actionParams.ConversationId, htmlElementContextOut);
64+
ILocator? element = Locator(actionParams.ContextId, htmlElementContextOut);
6565

6666
try
6767
{
@@ -70,11 +70,11 @@ public async Task<BrowserActionResult> ChangeListValue(BrowserActionParams actio
7070
if (!isVisible)
7171
{
7272
// Select the element you want to make visible (replace with your own selector)
73-
var control = await _instance.GetPage(actionParams.ConversationId)
73+
var control = await _instance.GetPage(actionParams.ContextId)
7474
.QuerySelectorAsync($"#{htmlElementContextOut.ElementId}");
7575

7676
// Show the element by modifying its CSS styles
77-
await _instance.GetPage(actionParams.ConversationId)
77+
await _instance.GetPage(actionParams.ContextId)
7878
.EvaluateAsync(@"(element) => {
7979
element.style.display = 'block';
8080
element.style.visibility = 'visible';
@@ -92,11 +92,11 @@ await element.SelectOptionAsync(new SelectOptionValue
9292
if (!isVisible)
9393
{
9494
// Select the element you want to make visible (replace with your own selector)
95-
var control = await _instance.GetPage(actionParams.ConversationId)
95+
var control = await _instance.GetPage(actionParams.ContextId)
9696
.QuerySelectorAsync($"#{htmlElementContextOut.ElementId}");
9797

9898
// Show the element by modifying its CSS styles
99-
await _instance.GetPage(actionParams.ConversationId).EvaluateAsync(@"(element) => {
99+
await _instance.GetPage(actionParams.ContextId).EvaluateAsync(@"(element) => {
100100
element.style.display = 'none';
101101
element.style.visibility = 'hidden';
102102
}", control);

src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.CheckRadioButton.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ public partial class PlaywrightWebDriver
55
public async Task<BrowserActionResult> CheckRadioButton(BrowserActionParams actionParams)
66
{
77
var result = new BrowserActionResult();
8-
await _instance.Wait(actionParams.ConversationId);
8+
await _instance.Wait(actionParams.ContextId);
99

1010
// Retrieve the page raw html and infer the element path
1111
var regexExpression = actionParams.Context.MatchRule.ToLower() switch
@@ -16,7 +16,7 @@ public async Task<BrowserActionResult> CheckRadioButton(BrowserActionParams acti
1616
_ => $"^{actionParams.Context.ElementText}$"
1717
};
1818
var regex = new Regex(regexExpression, RegexOptions.IgnoreCase);
19-
var elements = _instance.GetPage(actionParams.ConversationId).GetByText(regex);
19+
var elements = _instance.GetPage(actionParams.ContextId).GetByText(regex);
2020
var count = await elements.CountAsync();
2121

2222
var errorMessage = $"Can't locate element by keyword {actionParams.Context.ElementText}";

src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.ClickButton.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ public partial class PlaywrightWebDriver
55
public async Task<BrowserActionResult> ClickButton(BrowserActionParams actionParams)
66
{
77
var result = new BrowserActionResult();
8-
await _instance.Wait(actionParams.ConversationId);
8+
await _instance.Wait(actionParams.ContextId);
99

1010
// Find by text exactly match
11-
var elements = _instance.GetPage(actionParams.ConversationId)
11+
var elements = _instance.GetPage(actionParams.ContextId)
1212
.GetByRole(AriaRole.Button, new PageGetByRoleOptions
1313
{
1414
Name = actionParams.Context.ElementName
@@ -17,7 +17,7 @@ public async Task<BrowserActionResult> ClickButton(BrowserActionParams actionPar
1717

1818
if (count == 0)
1919
{
20-
elements = _instance.GetPage(actionParams.ConversationId)
20+
elements = _instance.GetPage(actionParams.ContextId)
2121
.GetByRole(AriaRole.Link, new PageGetByRoleOptions
2222
{
2323
Name = actionParams.Context.ElementName
@@ -27,7 +27,7 @@ public async Task<BrowserActionResult> ClickButton(BrowserActionParams actionPar
2727

2828
if (count == 0)
2929
{
30-
elements = _instance.GetPage(actionParams.ConversationId)
30+
elements = _instance.GetPage(actionParams.ContextId)
3131
.GetByText(actionParams.Context.ElementName);
3232
count = await elements.CountAsync();
3333
}
@@ -36,12 +36,12 @@ public async Task<BrowserActionResult> ClickButton(BrowserActionParams actionPar
3636
{
3737
// Infer element if not found
3838
var driverService = _services.GetRequiredService<WebDriverService>();
39-
var html = await FilteredButtonHtml(actionParams.ConversationId);
39+
var html = await FilteredButtonHtml(actionParams.ContextId);
4040
var htmlElementContextOut = await driverService.InferElement(actionParams.Agent,
4141
html,
4242
actionParams.Context.ElementName,
4343
actionParams.MessageId);
44-
elements = Locator(actionParams.ConversationId, htmlElementContextOut);
44+
elements = Locator(actionParams.ContextId, htmlElementContextOut);
4545

4646
if (elements == null)
4747
{
@@ -54,7 +54,7 @@ public async Task<BrowserActionResult> ClickButton(BrowserActionParams actionPar
5454
try
5555
{
5656
await elements.ClickAsync();
57-
await _instance.Wait(actionParams.ConversationId);
57+
await _instance.Wait(actionParams.ContextId);
5858

5959
result.IsSuccess = true;
6060
}
@@ -67,12 +67,12 @@ public async Task<BrowserActionResult> ClickButton(BrowserActionParams actionPar
6767
return result;
6868
}
6969

70-
private async Task<string> FilteredButtonHtml(string conversationId)
70+
private async Task<string> FilteredButtonHtml(string contextId)
7171
{
7272
var driverService = _services.GetRequiredService<WebDriverService>();
7373

7474
// Retrieve the page raw html and infer the element path
75-
var body = await _instance.GetPage(conversationId).QuerySelectorAsync("body");
75+
var body = await _instance.GetPage(contextId).QuerySelectorAsync("body");
7676

7777
var str = new List<string>();
7878
/*var anchors = await body.QuerySelectorAllAsync("a");

src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.ClickElement.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ public partial class PlaywrightWebDriver
55
public async Task<BrowserActionResult> ClickElement(BrowserActionParams actionParams)
66
{
77
var result = new BrowserActionResult();
8-
await _instance.Wait(actionParams.ConversationId);
8+
await _instance.Wait(actionParams.ContextId);
99

10-
var page = _instance.GetPage(actionParams.ConversationId);
10+
var page = _instance.GetPage(actionParams.ContextId);
1111
ILocator locator = default;
1212
int count = 0;
1313

@@ -51,7 +51,7 @@ public async Task<BrowserActionResult> ClickElement(BrowserActionParams actionPa
5151
await locator.ClickAsync();
5252

5353
// Triggered ajax
54-
await _instance.Wait(actionParams.ConversationId);
54+
await _instance.Wait(actionParams.ContextId);
5555

5656
result.IsSuccess = true;
5757
}

src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.CloseBrowser.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver;
22

33
public partial class PlaywrightWebDriver
44
{
5-
public async Task CloseBrowser(string conversationId)
5+
public async Task CloseBrowser(string contextId)
66
{
7-
await _instance.Close(conversationId);
7+
await _instance.Close(contextId);
88
}
99
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver;
2+
3+
public partial class PlaywrightWebDriver
4+
{
5+
public async Task CloseCurrentPage(string contextId)
6+
{
7+
await _instance.CloseCurrentPage(contextId);
8+
}
9+
}

src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.DoAction.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
using BotSharp.Abstraction.Browsing.Enums;
2-
31
namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver;
42

53
public partial class PlaywrightWebDriver
64
{
75
public async Task DoAction(MessageInfo message, ElementActionArgs action, BrowserActionResult result)
86
{
9-
var page = _instance.GetPage(message.ConversationId);
7+
var page = _instance.GetPage(message.ContextId);
108
ILocator locator = page.Locator(result.Selector);
119

1210
if (action.Action == BroswerActionEnum.Click)

src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.EvaluateScript.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ namespace BotSharp.Plugin.WebDriver.Drivers.PlaywrightDriver;
22

33
public partial class PlaywrightWebDriver
44
{
5-
public async Task<T> EvaluateScript<T>(string conversationId, string script)
5+
public async Task<T> EvaluateScript<T>(string contextId, string script)
66
{
7-
await _instance.Wait(conversationId);
7+
await _instance.Wait(contextId);
88

9-
return await _instance.GetPage(conversationId).EvaluateAsync<T>(script);
9+
return await _instance.GetPage(contextId).EvaluateAsync<T>(script);
1010
}
1111
}

src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.ExtractData.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ public partial class PlaywrightWebDriver
44
{
55
public async Task<string> ExtractData(BrowserActionParams actionParams)
66
{
7-
await _instance.Wait(actionParams.ConversationId);
7+
await _instance.Wait(actionParams.ContextId);
88

99
await Task.Delay(3000);
1010

1111
// Retrieve the page raw html and infer the element path
12-
var body = await _instance.GetPage(actionParams.ConversationId).QuerySelectorAsync("body");
12+
var body = await _instance.GetPage(actionParams.ContextId).QuerySelectorAsync("body");
1313
var content = await body.InnerTextAsync();
1414

1515
var driverService = _services.GetRequiredService<WebDriverService>();

src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightWebDriver.GetAttributeValue.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ public partial class PlaywrightWebDriver
44
{
55
public async Task<string> GetAttributeValue(MessageInfo message, ElementLocatingArgs location, BrowserActionResult result)
66
{
7-
var page = _instance.GetPage(message.ConversationId);
7+
var page = _instance.GetPage(message.ContextId);
88
ILocator locator = page.Locator(result.Selector);
99
var value = string.Empty;
1010

0 commit comments

Comments
 (0)