Skip to content

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. 内存管理

  • 及时释放引用:避免内存泄漏
  • 监控浏览器数量:防止过度创建
  • 使用弱引用:在适当场景下使用弱引用

注意事项

  1. 生命周期管理:浏览器关闭后及时清理相关引用
  2. 线程安全:在多线程环境下使用适当的同步机制
  3. 异常处理:始终检查浏览器有效性
  4. 性能考虑:避免频繁的浏览器查找操作
  5. 标识唯一性:确保user_flag的唯一性,避免冲突
  6. 资源监控:定期监控浏览器资源使用情况

相关文档

如果文档对您有帮助,欢迎 请喝咖啡 ☕ | 软件发布 | 源码购买