蝎子萌 2019-06-17 09:10 采纳率: 0%
浏览 1358

winform CEFSharp 由于网页里有几个图片的状态是未加载完成,无法触发FrameLoadEnd

如题,我在FrameLoadEnd中写入了一些代码,但是一直无法触发,抓包后发现是几个图片未能加载完成导致,这种的请问怎么处理呢,有没有什么好的办法

  • 写回答

1条回答 默认 最新

  • 一只小爪磕 新星创作者: 前端开发技术领域 2024-05-26 15:59
    关注

    本答案由爪磕协同GPT-4o回答,希望对您有所帮助 解决问题望采纳!


    在使用CefSharp时,如果网页由于某些资源(如图片)未能加载完成导致 FrameLoadEnd 事件无法触发,可以考虑以下几种解决方案:

    1. 检查 LoadingStateChanged 事件

    LoadingStateChanged 事件在页面加载状态改变时会触发,包括页面开始加载和加载完成的状态。可以通过这个事件判断页面是否完全加载:

    browser.LoadingStateChanged += (sender, args) =>
    {
        if (!args.IsLoading)
        {
            // 页面加载完成时执行的代码
        }
    };
    

    2. 使用 RequestHandler 捕捉加载状态

    通过实现 IRequestHandler 接口,可以捕捉每个资源请求的状态。你可以在请求完成后检查所有资源是否加载完毕:

    public class CustomRequestHandler : IRequestHandler
    {
        public bool OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
        {
            if (response.StatusCode == 200)
            {
                // 资源加载成功
            }
            else
            {
                // 资源加载失败
            }
    
            // 根据需要实现其他逻辑
            return false;
        }
    
        // 实现其他 IRequestHandler 接口方法
    }
    

    然后在初始化浏览器时设置这个请求处理器:

    var browser = new ChromiumWebBrowser("http://example.com");
    browser.RequestHandler = new CustomRequestHandler();
    

    3. 使用 JavaScript 检查图片加载状态

    你可以通过注入 JavaScript 检查图片的加载状态,然后通过 CefSharp 的 EvaluateScriptAsync 方法调用这个脚本:

    browser.FrameLoadEnd += async (sender, args) =>
    {
        if (args.Frame.IsMain)
        {
            var script = @"
                (function() {
                    var images = document.getElementsByTagName('img');
                    for (var i = 0; i < images.length; i++) {
                        if (!images[i].complete) {
                            return false;
                        }
                    }
                    return true;
                })();
            ";
    
            var result = await args.Frame.EvaluateScriptAsync(script);
            if (result.Success && (bool)result.Result)
            {
                // 所有图片加载完成时执行的代码
            }
        }
    };
    

    4. 设置资源加载超时

    为了防止某些资源永远无法加载,可以设置一个超时机制,在一定时间后认为页面加载完成:

    browser.FrameLoadEnd += async (sender, args) =>
    {
        if (args.Frame.IsMain)
        {
            // 设置一个超时
            await Task.Delay(5000); // 5秒超时
    
            // 超时后执行的代码
        }
    };
    

    5. 检查资源加载错误

    可以通过 LoadError 事件捕捉资源加载错误,记录哪些资源加载失败,然后在一定条件下认为页面加载完成:

    browser.LoadError += (sender, args) =>
    {
        // 记录错误
        // args.ErrorCode, args.ErrorText, args.FailedUrl
    };
    

    通过上述方法,你可以更灵活地处理网页资源加载问题,并确保在适当的时机执行你需要的逻辑。

    评论

报告相同问题?