WebBrowser 控件不呈现某些页面
Posted
技术标签:
【中文标题】WebBrowser 控件不呈现某些页面【英文标题】:WebBrowser control does not render some pages 【发布时间】:2013-02-24 00:17:45 【问题描述】:我正在开发一个托管 WebBrowser 控件并保存网页屏幕截图的应用程序。 (C#、VS2008、IE 9、Vista。全部是最新的。FEATURE_BROWSER_EMULATION 设置为 0x2328)
应用程序获取一个 url 列表并逐个导航到 url 并保存屏幕截图。应用程序流程简单如下:从文件中读取 url,首先使用 HttpWebRequest 获取它,如果它存在并且如果它是 html 调用 webBrowser.Navigate(url),等到 WebBrowser.ReadyState 为 WebBrowserReadyState.Complete (处理 WebBrowser.DocumentCompleted 事件并简单在 ReadyState 为 WebBrowserReadyState.Complete 之前什么也不做),再等几秒钟以确保安全(最多测试 10 秒),保存屏幕截图并移至下一个 url。 它适用于几乎所有 url(来自许多不同站点的页面),但嵌入在我的应用程序中的 WebBrowser 不会呈现某些 url,尤其是来自 www.securityfocus.com 的页面,例如:http://www.securityfocus.com/bid/52023
我尝试禁用缓存,在每次请求之前清除缓存,等待最多 10 秒,以便给它一些时间来呈现等无济于事。我在视觉上确认 WebBrowser 没有呈现页面,这不是与保存屏幕截图相关的问题(我正在使用 BitBlt,但我认为它不相关)。页面使用 IE 正常呈现。
如果您对为什么会发生这种情况有任何建议,请告诉我。提前致谢
【问题讨论】:
页面在IE中渲染得很好,WebBrowser是否足够扩展?也许尝试最大化窗口? 【参考方案1】:我设法解决了这个问题! 事实证明,在触发最终 DocumentCompleted 事件后,webbrowser 需要少量时间来实际呈现页面。通常我们不会注意到这种轻微的延迟,但是当您在最后一个(加载 url 时将触发许多 DocumentCompleted 事件)页面的 DocumentCompleted 之后立即运行循环时,webbrowser 在保存之前无法找到时间来呈现页面screenshot.So 你必须给它一些时间来呈现页面。
如果你天真地在 UI 线程上调用 sleep 等待渲染,渲染也会休眠,在你保存截图之前页面不会被渲染。
所以你必须在另一个线程中等待,让 UI 线程空闲以留出时间完成页面渲染,然后通过在主 UI 线程上调用 Invoke 方法从子线程返回到 UI 线程。
【讨论】:
+1 我希望这也能解决我的渲染问题 - 听起来很有希望!以上是关于WebBrowser 控件不呈现某些页面的主要内容,如果未能解决你的问题,请参考以下文章
<总结>delphi WebBrowser控件的使用中出现的bug
如何在 WebBrowser 控件中获取呈现的 html(由 Javascript 处理)?