WebView2使用ExecuteScriptAsync提取数据时outerHTML无目标内容问题咨询
你遇到的情况大概率是目标数据没有挂载到当前页面的根DOM树上,或者被前端隔离机制屏蔽了,所以不会出现在document.documentElement.outerHTML的返回结果里。以下是几种可以通过ExecuteScriptAsync拉取、可能存储目标数据的内容:
Shadow DOM 内部内容
现在很多前端组件会使用Shadow DOM实现样式和DOM隔离,Shadow Root内部的内容不会被包含在父文档的outerHTML中,浏览器审查元素可以正常展示是因为开发者工具默认做了穿透处理。你可以执行以下脚本拉取页面所有Shadow DOM的内容:JSON.stringify(Array.from(document.querySelectorAll('*')).reduce((res, el) => { if(el.shadowRoot) res.push(el.shadowRoot.innerHTML); return res; }, []))同域Iframe内部内容
如果目标数据渲染在页面内嵌的iframe中,父文档的outerHTML仅会保留iframe标签,不会包含iframe的内部内容。同域场景下可以执行以下脚本拉取指定iframe的内容:document.querySelector('iframe的选择器').contentDocument.documentElement.outerHTML要是iframe跨域,你需要提前配置WebView2的跨域访问权限再执行拉取操作。
前端全局变量存储的原始数据
很多网站不会把全量数据直接渲染到DOM上,会把接口返回的原始数据存在window下的全局变量中做缓存。你可以先打开WebView2的开发者工具(调用CoreWebView2.OpenDevToolsWindow()即可),在控制台执行console.log(window)遍历查找存储目标数据的变量,之后直接执行对应脚本拉取:JSON.stringify(window.目标变量名)页面全量可见文本
如果你只需要提取文本类目标数据,不需要完整DOM结构,可以直接拉取页面所有渲染后的可见文本,绕过DOM隔离的限制:document.body.innerTextSVG/Canvas 相关内容
如果目标内容是SVG渲染的,可以直接拉取SVG节点的完整内容解析文本:document.querySelector('svg').outerHTML如果是Canvas绘制的文本内容,DOM中不会存储对应文本,需要额外调用OCR能力识别。
内容的提问来源于stack exchange,提问作者user8128940

