CefSharp ExecuteScriptAsync执行body.onload不生效解决方法
问题根因
当前注入的脚本将DOM插入逻辑绑定到了document.body.onmouseup事件上,仅当鼠标在页面内松开时才会触发执行,因此必须点击窗口才会显示文本。同时原注入脚本存在3处语法/变量错误,即便修改触发时机也无法正常运行:
- 调用了不存在的API
document.getElementsById,正确的单元素查询API为document.getElementById - 变量名不匹配:获取到的container元素存入了
main变量,后续插入元素时错误使用了未定义的container变量 - 变量名不匹配:创建的新div存入了
newDiv变量,后续插入时错误使用了未定义的infoDiv变量
修改方案
Browser_FrameLoadEnd本身就是CefSharp提供的、帧加载完成后触发的回调事件,触发时机和页面原生onload完全一致,不需要额外绑定页面onload事件,直接在回调内执行DOM操作逻辑即可,修正后的代码如下:
private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e) { if (e.Frame.IsMain) { browser.ExecuteScriptAsync(@" // 直接执行DOM插入逻辑,无需绑定鼠标事件 var container = document.getElementById('container'); // 增加判空逻辑,避免页面不存在对应元素时抛出JS错误 if (container) { var newDiv = document.createElement('div'); newDiv.innerHTML = 'NEW TEXT MESSAGE'; container.appendChild(newDiv); } "); } }
补充说明
如果目标页面的container元素是后续JS动态渲染生成的、主帧加载完成时还未挂载到DOM上,可以在注入脚本里加个短间隔轮询,等元素出现后再插入内容,避免插入失败。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

