FBro获取浏览器
概述
FBro获取浏览器是浏览器管理的核心功能,提供多种方式来检索和管理已创建的浏览器实例。合理的浏览器获取策略对于应用程序的稳定性和性能至关重要。
浏览器获取方法
1. 通过user_flag标识获取
方法签名:
csharp
FBroSharpBrowser GetBrowserFromFlag(string user_flag)基础使用:
csharp
// 通过标识获取浏览器
var targetBrowser = FBroSharpBrowserListControl.GetBrowserFromFlag("main_browser_20241201143025");
if (targetBrowser != null && targetBrowser.IsValid())
{
Console.WriteLine($"成功获取浏览器: {targetBrowser.GetIdentifier()}");
// 执行浏览器操作
targetBrowser.GetMainFrame().LoadURL("https://www.example.com");
}
else
{
Console.WriteLine("未找到指定标识的浏览器或浏览器已失效");
}安全获取封装:
csharp
/// <summary>
/// 安全获取浏览器的辅助方法
/// </summary>
/// <param name="userFlag">用户标识</param>
/// <returns>有效的浏览器实例或null</returns>
public static FBroSharpBrowser SafeGetBrowserByFlag(string userFlag)
{
try
{
if (string.IsNullOrEmpty(userFlag))
{
Console.WriteLine("浏览器标识不能为空");
return null;
}
var browser = FBroSharpBrowserListControl.GetBrowserFromFlag(userFlag);
if (browser == null)
{
Console.WriteLine($"未找到标识为 '{userFlag}' 的浏览器");
return null;
}
if (!browser.IsValid())
{
Console.WriteLine($"浏览器 '{userFlag}' 已失效");
return null;
}
Console.WriteLine($"成功获取浏览器: {userFlag} (ID: {browser.GetIdentifier()})");
return browser;
}
catch (Exception ex)
{
Console.WriteLine($"获取浏览器失败: {userFlag} - {ex.Message}");
return null;
}
}2. 通过浏览器ID获取
方法签名:
csharp
FBroSharpBrowser GetBrowserFromID(int browserID)基础使用:
csharp
// 通过浏览器ID获取
int browserId = 12345;
var targetBrowser = FBroSharpBrowserListControl.GetBrowserFromID(browserId);
if (targetBrowser != null && targetBrowser.IsValid())
{
Console.WriteLine($"通过ID获取浏览器成功: {browserId}");
}
else
{
Console.WriteLine($"未找到ID为 {browserId} 的浏览器");
}3. 枚举所有浏览器
csharp
/// <summary>
/// 获取所有有效的浏览器列表
/// </summary>
/// <returns>有效浏览器列表</returns>
public static List<FBroSharpBrowser> GetAllValidBrowsers()
{
var validBrowsers = new List<FBroSharpBrowser>();
try
{
// 枚举所有浏览器ID(具体实现取决于FBro API)
// 这里提供一个示例实现思路
for (int i = 0; i < 1000; i++) // 假设最大1000个浏览器
{
var browser = FBroSharpBrowserListControl.GetBrowserFromID(i);
if (browser != null && browser.IsValid())
{
validBrowsers.Add(browser);
}
}
Console.WriteLine($"找到 {validBrowsers.Count} 个有效浏览器");
}
catch (Exception ex)
{
Console.WriteLine($"枚举浏览器失败: {ex.Message}");
}
return validBrowsers;
}浏览器管理最佳实践
智能浏览器管理器
csharp
/// <summary>
/// 智能浏览器管理器
/// 结合user_flag管理和传统数组管理的优势
/// </summary>
public class SmartBrowserManager
{
private readonly Dictionary<string, BrowserInfo> browserRegistry = new Dictionary<string, BrowserInfo>();
private readonly List<FBroSharpBrowser> browserList = new List<FBroSharpBrowser>();
private readonly object lockObject = new object();
public class BrowserInfo
{
public string UserFlag { get; set; }
public int BrowserId { get; set; }
public DateTime CreatedTime { get; set; }
public string Purpose { get; set; }
public string InitialUrl { get; set; }
public bool IsValid => Browser?.IsValid() ?? false;
public FBroSharpBrowser Browser { get; set; }
}
/// <summary>
/// 注册浏览器
/// </summary>
/// <param name="browser">浏览器实例</param>
/// <param name="userFlag">用户标识</param>
/// <param name="purpose">用途描述</param>
public void RegisterBrowser(FBroSharpBrowser browser, string userFlag, string purpose = "")
{
if (browser == null || !browser.IsValid())
{
Console.WriteLine("无法注册无效的浏览器实例");
return;
}
lock (lockObject)
{
var browserInfo = new BrowserInfo
{
UserFlag = userFlag,
BrowserId = browser.GetIdentifier(),
CreatedTime = DateTime.Now,
Purpose = purpose,
Browser = browser
};
// 双重存储确保安全
browserRegistry[userFlag] = browserInfo;
browserList.Add(browser);
Console.WriteLine($"浏览器已注册: {userFlag} (ID: {browser.GetIdentifier()})");
}
}
/// <summary>
/// 通过标识获取浏览器
/// </summary>
/// <param name="userFlag">用户标识</param>
/// <returns>浏览器实例</returns>
public FBroSharpBrowser GetBrowserByFlag(string userFlag)
{
lock (lockObject)
{
// 首先从本地注册表获取
if (browserRegistry.ContainsKey(userFlag))
{
var info = browserRegistry[userFlag];
if (info.IsValid)
{
return info.Browser;
}
else
{
// 本地缓存已失效,清理并尝试从框架获取
Console.WriteLine($"本地缓存的浏览器已失效: {userFlag}");
CleanupInvalidBrowser(userFlag);
}
}
}
// 从框架内置列表获取
return SafeGetBrowserByFlag(userFlag);
}
/// <summary>
/// 通过ID获取浏览器
/// </summary>
/// <param name="browserId">浏览器ID</param>
/// <returns>浏览器实例</returns>
public FBroSharpBrowser GetBrowserById(int browserId)
{
lock (lockObject)
{
// 从本地列表查找
var browser = browserList.FirstOrDefault(b => b.IsValid() && b.GetIdentifier() == browserId);
if (browser != null)
{
return browser;
}
}
// 从框架内置列表获取
return FBroSharpBrowserListControl.GetBrowserFromID(browserId);
}
/// <summary>
/// 获取所有已注册的浏览器
/// </summary>
/// <returns>浏览器信息列表</returns>
public List<BrowserInfo> GetAllRegisteredBrowsers()
{
lock (lockObject)
{
return browserRegistry.Values.Where(info => info.IsValid).ToList();
}
}
/// <summary>
/// 按用途分类获取浏览器
/// </summary>
/// <param name="purpose">用途</param>
/// <returns>匹配的浏览器列表</returns>
public List<FBroSharpBrowser> GetBrowsersByPurpose(string purpose)
{
lock (lockObject)
{
return browserRegistry.Values
.Where(info => info.IsValid && info.Purpose.Contains(purpose))
.Select(info => info.Browser)
.ToList();
}
}
/// <summary>
/// 清理无效浏览器
/// </summary>
public void CleanupInvalidBrowsers()
{
lock (lockObject)
{
var invalidFlags = browserRegistry
.Where(kvp => !kvp.Value.IsValid)
.Select(kvp => kvp.Key)
.ToList();
foreach (var flag in invalidFlags)
{
CleanupInvalidBrowser(flag);
}
// 清理列表中的无效浏览器
browserList.RemoveAll(b => !b.IsValid());
Console.WriteLine($"清理完成,移除了 {invalidFlags.Count} 个无效浏览器");
}
}
/// <summary>
/// 清理指定的无效浏览器
/// </summary>
/// <param name="userFlag">用户标识</param>
private void CleanupInvalidBrowser(string userFlag)
{
if (browserRegistry.ContainsKey(userFlag))
{
var info = browserRegistry[userFlag];
browserList.RemoveAll(b => b.GetIdentifier() == info.BrowserId);
browserRegistry.Remove(userFlag);
Console.WriteLine($"已清理无效浏览器: {userFlag}");
}
}
/// <summary>
/// 获取统计信息
/// </summary>
/// <returns>统计信息</returns>
public BrowserStatistics GetStatistics()
{
lock (lockObject)
{
var validBrowsers = browserRegistry.Values.Where(info => info.IsValid).ToList();
return new BrowserStatistics
{
TotalRegistered = browserRegistry.Count,
ValidCount = validBrowsers.Count,
InvalidCount = browserRegistry.Count - validBrowsers.Count,
PurposeGroups = validBrowsers
.GroupBy(info => info.Purpose)
.ToDictionary(g => g.Key, g => g.Count())
};
}
}
public class BrowserStatistics
{
public int TotalRegistered { get; set; }
public int ValidCount { get; set; }
public int InvalidCount { get; set; }
public Dictionary<string, int> PurposeGroups { get; set; }
public override string ToString()
{
var sb = new StringBuilder();
sb.AppendLine("=== 浏览器统计信息 ===");
sb.AppendLine($"总注册数: {TotalRegistered}");
sb.AppendLine($"有效数: {ValidCount}");
sb.AppendLine($"无效数: {InvalidCount}");
sb.AppendLine("按用途分组:");
foreach (var group in PurposeGroups)
{
sb.AppendLine($" {group.Key}: {group.Value}");
}
return sb.ToString();
}
}
}优化的浏览器事件处理器
csharp
/// <summary>
/// 增强的浏览器事件处理器
/// 自动管理浏览器的注册和清理
/// </summary>
public class EnhancedBrowserEvent : FBroSharpBrowserEvent
{
private readonly SmartBrowserManager browserManager;
private readonly string userFlag;
private readonly string purpose;
public EnhancedBrowserEvent(SmartBrowserManager manager, string userFlag, string purpose = "")
{
this.browserManager = manager;
this.userFlag = userFlag;
this.purpose = purpose;
}
/// <summary>
/// 浏览器创建完成事件
/// 自动注册到管理器
/// </summary>
public override void OnAfterCreated(IFBroSharpBrowser browser, IFBroSharpDictionaryValue extrainfo)
{
Console.WriteLine($"[{MethodBase.GetCurrentMethod().Name}] 浏览器创建完成");
try
{
// 设置缩放级别
browser.SetZoomLevel(0.0);
// 判断是否为后台浏览器
bool isBackground = extrainfo?.GetBool("是否为后台") ?? false;
if (!isBackground)
{
// 自动注册到智能管理器
browserManager.RegisterBrowser((FBroSharpBrowser)browser, userFlag, purpose);
Console.WriteLine($"前台浏览器已注册: {userFlag}");
}
else
{
Console.WriteLine($"后台浏览器创建完成: {browser.GetIdentifier()}");
}
// 注入浏览器标识信息到页面
InjectBrowserInfo(browser, userFlag, purpose);
}
catch (Exception ex)
{
Console.WriteLine($"浏览器创建后处理失败: {ex.Message}");
}
}
/// <summary>
/// 浏览器即将关闭事件
/// 自动清理管理器中的记录
/// </summary>
public override void OnBeforeClose(IFBroSharpBrowser browser)
{
Console.WriteLine($"[{MethodBase.GetCurrentMethod().Name}] 浏览器即将关闭: {userFlag}");
try
{
// 清理管理器中的无效浏览器
browserManager.CleanupInvalidBrowsers();
}
catch (Exception ex)
{
Console.WriteLine($"清理浏览器记录失败: {ex.Message}");
}
}
/// <summary>
/// 注入浏览器标识信息到页面
/// </summary>
private void InjectBrowserInfo(IFBroSharpBrowser browser, string userFlag, string purpose)
{
try
{
string jsCode = $@"
// 注入浏览器标识信息
window.FBroBrowserInfo = {{
userFlag: '{userFlag}',
browserId: {browser.GetIdentifier()},
purpose: '{purpose}',
createdTime: '{DateTime.Now:yyyy-MM-dd HH:mm:ss}',
// 获取浏览器信息的工具函数
getInfo: function() {{
return {{
flag: this.userFlag,
id: this.browserId,
purpose: this.purpose,
created: this.createdTime,
url: window.location.href,
title: document.title
}};
}},
// 在控制台输出浏览器信息
logInfo: function() {{
console.log('FBro浏览器信息:', this.getInfo());
}}
}};
// 自动输出信息
window.FBroBrowserInfo.logInfo();
console.log('FBro浏览器标识已注入: {userFlag}');
";
browser.GetMainFrame().ExecuteJavaScript(jsCode, "", 0);
}
catch (Exception ex)
{
Console.WriteLine($"注入浏览器信息失败: {ex.Message}");
}
}
}高级获取模式
1. 模糊匹配获取
csharp
/// <summary>
/// 模糊匹配获取浏览器
/// </summary>
/// <param name="pattern">匹配模式</param>
/// <returns>匹配的浏览器列表</returns>
public static List<FBroSharpBrowser> GetBrowsersByPattern(string pattern)
{
var matchedBrowsers = new List<FBroSharpBrowser>();
try
{
// 这里需要根据实际的FBro API来实现
// 示例:通过遍历可能的标识来匹配
var allBrowsers = GetAllValidBrowsers();
foreach (var browser in allBrowsers)
{
// 这里需要一种方法来获取浏览器的标识
// 可能需要在创建时保存标识映射
Console.WriteLine($"检查浏览器: {browser.GetIdentifier()}");
}
}
catch (Exception ex)
{
Console.WriteLine($"模糊匹配失败: {ex.Message}");
}
return matchedBrowsers;
}2. 条件筛选获取
csharp
/// <summary>
/// 基于条件筛选浏览器
/// </summary>
/// <param name="predicate">筛选条件</param>
/// <returns>符合条件的浏览器列表</returns>
public static List<FBroSharpBrowser> GetBrowsersWhere(Func<FBroSharpBrowser, bool> predicate)
{
var allBrowsers = GetAllValidBrowsers();
return allBrowsers.Where(predicate).ToList();
}
// 使用示例
public static void DemonstrateConditionalRetrieval()
{
// 获取所有有效的浏览器
var validBrowsers = GetBrowsersWhere(browser => browser.IsValid());
Console.WriteLine($"找到 {validBrowsers.Count} 个有效浏览器");
// 获取特定ID范围的浏览器
var recentBrowsers = GetBrowsersWhere(browser => browser.GetIdentifier() > 1000);
Console.WriteLine($"找到 {recentBrowsers.Count} 个较新的浏览器");
}3. 缓存优化获取
csharp
/// <summary>
/// 带缓存的浏览器获取器
/// </summary>
public class CachedBrowserRetriever
{
private readonly Dictionary<string, FBroSharpBrowser> cache = new Dictionary<string, FBroSharpBrowser>();
private readonly object cacheLock = new object();
private DateTime lastCacheUpdate = DateTime.MinValue;
private readonly TimeSpan cacheTimeout = TimeSpan.FromMinutes(5);
/// <summary>
/// 缓存获取浏览器
/// </summary>
/// <param name="userFlag">用户标识</param>
/// <returns>浏览器实例</returns>
public FBroSharpBrowser GetBrowserCached(string userFlag)
{
lock (cacheLock)
{
// 检查缓存是否过期
if (DateTime.Now - lastCacheUpdate > cacheTimeout)
{
RefreshCache();
}
// 从缓存获取
if (cache.ContainsKey(userFlag))
{
var cachedBrowser = cache[userFlag];
if (cachedBrowser.IsValid())
{
return cachedBrowser;
}
else
{
// 移除无效的缓存
cache.Remove(userFlag);
}
}
// 缓存未命中,从框架获取并缓存
var browser = SafeGetBrowserByFlag(userFlag);
if (browser != null)
{
cache[userFlag] = browser;
}
return browser;
}
}
/// <summary>
/// 刷新缓存
/// </summary>
private void RefreshCache()
{
Console.WriteLine("刷新浏览器缓存...");
// 清理无效的缓存项
var invalidKeys = cache.Where(kvp => !kvp.Value.IsValid()).Select(kvp => kvp.Key).ToList();
foreach (var key in invalidKeys)
{
cache.Remove(key);
}
lastCacheUpdate = DateTime.Now;
Console.WriteLine($"缓存刷新完成,移除了 {invalidKeys.Count} 个无效项");
}
/// <summary>
/// 清空缓存
/// </summary>
public void ClearCache()
{
lock (cacheLock)
{
cache.Clear();
lastCacheUpdate = DateTime.MinValue;
Console.WriteLine("浏览器缓存已清空");
}
}
}实际应用场景
1. 多窗口应用管理
csharp
/// <summary>
/// 多窗口应用示例
/// </summary>
public class MultiWindowApp
{
private readonly SmartBrowserManager browserManager = new SmartBrowserManager();
public void InitializeApp()
{
// 创建主浏览器
CreateMainBrowser();
// 创建辅助浏览器
CreateAuxiliaryBrowsers();
// 演示获取和操作
DemonstrateBrowserOperations();
}
private void CreateMainBrowser()
{
string mainFlag = "app_main_browser";
var browserEvent = new EnhancedBrowserEvent(browserManager, mainFlag, "主窗口");
// 创建主浏览器的代码...
Console.WriteLine("主浏览器创建完成");
}
private void CreateAuxiliaryBrowsers()
{
string[] auxUrls = {
"https://www.google.com",
"https://www.github.com",
"https://www.stackoverflow.com"
};
for (int i = 0; i < auxUrls.Length; i++)
{
string auxFlag = $"app_aux_browser_{i}";
var browserEvent = new EnhancedBrowserEvent(browserManager, auxFlag, $"辅助窗口{i + 1}");
// 创建辅助浏览器的代码...
}
}
private void DemonstrateBrowserOperations()
{
// 获取主浏览器
var mainBrowser = browserManager.GetBrowserByFlag("app_main_browser");
if (mainBrowser != null)
{
Console.WriteLine("主浏览器操作...");
mainBrowser.GetMainFrame().LoadURL("https://www.example.com");
}
// 批量操作辅助浏览器
var auxBrowsers = browserManager.GetBrowsersByPurpose("辅助窗口");
foreach (var browser in auxBrowsers)
{
string jsCode = "document.body.style.border = '2px solid red';";
browser.GetMainFrame().ExecuteJavaScript(jsCode, "", 0);
}
// 显示统计信息
var stats = browserManager.GetStatistics();
Console.WriteLine(stats.ToString());
}
}2. 浏览器健康监控
csharp
/// <summary>
/// 浏览器健康监控系统
/// </summary>
public class BrowserHealthMonitor
{
private readonly SmartBrowserManager browserManager;
private readonly Timer healthCheckTimer;
public BrowserHealthMonitor(SmartBrowserManager manager)
{
browserManager = manager;
healthCheckTimer = new Timer(PerformHealthCheck, null, TimeSpan.Zero, TimeSpan.FromMinutes(1));
}
private void PerformHealthCheck(object state)
{
try
{
Console.WriteLine("执行浏览器健康检查...");
var allBrowsers = browserManager.GetAllRegisteredBrowsers();
int healthyCount = 0;
int unhealthyCount = 0;
foreach (var browserInfo in allBrowsers)
{
if (IsBrowserHealthy(browserInfo.Browser))
{
healthyCount++;
}
else
{
unhealthyCount++;
Console.WriteLine($"发现不健康的浏览器: {browserInfo.UserFlag}");
}
}
Console.WriteLine($"健康检查完成 - 健康: {healthyCount}, 不健康: {unhealthyCount}");
// 清理不健康的浏览器
if (unhealthyCount > 0)
{
browserManager.CleanupInvalidBrowsers();
}
}
catch (Exception ex)
{
Console.WriteLine($"健康检查失败: {ex.Message}");
}
}
private bool IsBrowserHealthy(FBroSharpBrowser browser)
{
try
{
return browser != null && browser.IsValid();
}
catch
{
return false;
}
}
}错误处理和异常管理
常见获取错误处理
csharp
/// <summary>
/// 浏览器获取异常处理器
/// </summary>
public static class BrowserRetrievalErrorHandler
{
/// <summary>
/// 安全执行浏览器操作
/// </summary>
/// <param name="userFlag">浏览器标识</param>
/// <param name="action">要执行的操作</param>
/// <returns>操作是否成功</returns>
public static bool SafeExecuteBrowserAction(string userFlag, Action<FBroSharpBrowser> action)
{
try
{
var browser = SafeGetBrowserByFlag(userFlag);
if (browser == null)
{
Console.WriteLine($"无法获取浏览器: {userFlag}");
return false;
}
action(browser);
return true;
}
catch (Exception ex)
{
Console.WriteLine($"执行浏览器操作失败: {userFlag} - {ex.Message}");
return false;
}
}
/// <summary>
/// 带重试的浏览器获取
/// </summary>
/// <param name="userFlag">浏览器标识</param>
/// <param name="maxRetries">最大重试次数</param>
/// <param name="retryDelay">重试延迟(毫秒)</param>
/// <returns>浏览器实例</returns>
public static FBroSharpBrowser GetBrowserWithRetry(string userFlag, int maxRetries = 3, int retryDelay = 1000)
{
for (int attempt = 1; attempt <= maxRetries; attempt++)
{
try
{
var browser = SafeGetBrowserByFlag(userFlag);
if (browser != null)
{
Console.WriteLine($"第 {attempt} 次尝试成功获取浏览器: {userFlag}");
return browser;
}
}
catch (Exception ex)
{
Console.WriteLine($"第 {attempt} 次获取浏览器失败: {ex.Message}");
}
if (attempt < maxRetries)
{
Console.WriteLine($"等待 {retryDelay}ms 后重试...");
System.Threading.Thread.Sleep(retryDelay);
}
}
Console.WriteLine($"经过 {maxRetries} 次尝试后仍无法获取浏览器: {userFlag}");
return null;
}
}性能优化建议
1. 获取策略优化
- 优先使用user_flag:比ID查找更直接高效
- 缓存频繁访问的浏览器:避免重复查找
- 定期清理无效浏览器:保持列表整洁
- 批量操作:减少单独获取的次数
2. 内存管理
- 及时释放引用:避免内存泄漏
- 监控浏览器数量:防止过度创建
- 使用弱引用:在适当场景下使用弱引用
注意事项
- 生命周期管理:浏览器关闭后及时清理相关引用
- 线程安全:在多线程环境下使用适当的同步机制
- 异常处理:始终检查浏览器有效性
- 性能考虑:避免频繁的浏览器查找操作
- 标识唯一性:确保user_flag的唯一性,避免冲突
- 资源监控:定期监控浏览器资源使用情况