【问题标题】:C# webBrowser script errorC# webBrowser 脚本错误
【发布时间】:2016-09-17 23:09:18
【问题描述】:

尝试使用 webBrowser.Navigate("https://home.nest.com/") 加载页面时,我不断收到脚本错误。它可以从我的普通 Internet 浏览器中正常显示,但不能在我的程序中显示。

谁能指出我正确的方向?

【问题讨论】:

  • 在第 358 行发布错误引用的脚本。我们不是读心术的人,不看代码我们无法判断问题所在。
  • 你已经尝试webBrowser.ScriptErrorsSuppressed = true;了吗?
  • 是的,页面没有加载。
  • 我是新手,通过反复试验学习所有这些知识,所以如果我问错了问题,请不要咬我的头.....Dgibbs。

标签: c# webbrowser-control


【解决方案1】:

脚本错误总是在集成的 Internet Explorer WebBrowser 控件中发生,即使它使用的是版本 11。现代网站严重依赖大量 Javascript 文件和动态呈现。您只需在常规浏览器中观看该页面加载即可看到这一点。控件有时无法切断它。

您可能想尝试一些替代浏览器控件。无法保证它可以与其中任何一个一起使用,但至少可以尝试一下。

  • Awesomium :最初基于 Chromium。我不知道他们是否仍然集成 Chromium 更改,或者他们是否已经朝着自己的方向发展。它可以免费供个人使用,也可以用于商业用途,收入低于 10 万美元。
  • DotNetBrowser:将基于 Chromium 的 WPF / WinForms 组件嵌入到您的 .NET 应用程序中,以显示使用 HTML5、CSS3、JavaScript、Silverlight 等构建的现代网页。
  • geckofx:用于将 Mozilla Gecko (Firefox) 嵌入 .NET 应用程序的开源组件。
  • Xilium.CefGlue:Marshall A. Greenblatt 的 Chromium Embedded Framework (CEF) 的 .NET/Mono 绑定。
  • BrowseEmAll : BrowseEmAll.Cef (Chrome), BrowseEmAll.Gecko (Firefox), BrowseEmAll Core API (Chrome,Firefox,IE - COMMERCIAL)

可能还有其他的,但如果你想走这条路,这应该让你从一些更受欢迎的活跃项目开始。

【讨论】:

  • @imrdnck 不客气。不幸的是,框架浏览器即使使用 IE11 也无法工作,但我们真的无能为力,只能去找专门做功能替换的人。 :-)
【解决方案2】:

您应该将您的程序名称添加到寄存器 HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION 使用与普通互联网浏览器相同的最新功能。

对于我来说,值 8000 (0x1F40) - IE8 模式可以解决很多脚本错误问题。

参考:

Use latest version of Internet Explorer in the webbrowser control

【讨论】:

    【解决方案3】:

    作为this link 回答:

    你必须只添加这一行:

    webBrowser.ScriptErrorsSuppressed = true;
    

    【讨论】:

    • 这对我有用。我正在使用带有 .net 框架 4.6.1 的 vs 2017
    • 基于 SPA 的网页根本无法正确呈现。
    • 不! “脚本错误抑制”这个词,表达了自己!它抑制脚本!就像你忽略了一个问题而不是解决它。这实际上有助于看不到烦人的“错误消息”对话框;但是,它会阻止脚本运行,因此页面将无法正确加载。
    【解决方案4】:

    WebBrowser 控件能够呈现大多数网页,但默认情况下它会尝试以兼容模式呈现页面(几乎是 IE7,因此存在问题)。如果您正在构建自己的页面,这很简单,只需将以下标记添加到标题中,它应该可以正常呈现...

    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
    

    但是,如果您尝试渲染无法添加标签的第三方网站,事情就会变得更加困难。如上所述,如果它只是在您自己的计算机上,您可以使用注册表项 (HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION)。

    如果这些选项都不是可能的解决方案,那么使用不同的浏览器控件(同样,上面的好建议)几乎是您唯一的选择。

    https://docs.microsoft.com/en-gb/archive/blogs/patricka/controlling-webbrowser-control-compatibility 有一篇关于控制浏览器控制兼容模式的精彩博客

    【讨论】:

      【解决方案5】:
        private void Form1_Load(object sender, EventArgs e)
        {
                  var appName = Process.GetCurrentProcess().ProcessName + ".exe";
                  SetIE8KeyforWebBrowserControl(appName);
      
                  webBrowser1.ScriptErrorsSuppressed = true;
        }
      
      
      
      private void SetIE8KeyforWebBrowserControl(string appName)
      {
           RegistryKey Regkey = null;
           try
           {
               // For 64 bit machine
               if (Environment.Is64BitOperatingSystem)
                    Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Wow6432Node\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION", true);
               else  //For 32 bit machine
                     Regkey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION", true);
      
                // If the path is not correct or
                // if the user haven't priviledges to access the registry
                if (Regkey == null)
                {
                    MessageBox.Show("Application Settings Failed - Address Not found");
                    return;
                }
      
                string FindAppkey = Convert.ToString(Regkey.GetValue(appName));
      
                // Check if key is already present
                if (FindAppkey == "8000")
                {
                    MessageBox.Show("Required Application Settings Present");
                    Regkey.Close();
                    return;
                }
      
                // If a key is not present add the key, Key value 8000 (decimal)
                if (string.IsNullOrEmpty(FindAppkey))
                    Regkey.SetValue(appName, unchecked((int)0x1F40), RegistryValueKind.DWord);
      
                 // Check for the key after adding
                 FindAppkey = Convert.ToString(Regkey.GetValue(appName));
      
                 if (FindAppkey == "8000")
                     MessageBox.Show("Application Settings Applied Successfully");
                 else
                     MessageBox.Show("Application Settings Failed, Ref: " + FindAppkey);
             }
             catch (Exception ex)
             {
                 MessageBox.Show("Application Settings Failed");
                 MessageBox.Show(ex.Message);
             }
             finally
             {
                 // Close the Registry
                 if (Regkey != null)
                     Regkey.Close();
             }
         }
      

      【讨论】:

      • 如果你能对你的代码做一些解释就好了
      【解决方案6】:

      您甚至可以将注册表值设置为 11000 以获得最新版本的 IE!

      【讨论】:

      • 注册参数在哪里?
      猜你喜欢
      • 2012-10-20
      • 2012-09-10
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 2014-05-07
      • 2013-05-19
      相关资源
      最近更新 更多