C# webBrowser脚本错误

22

我在尝试使用 webBrowser.Navigate("https://home.nest.com/") 加载页面时,一直收到脚本错误。虽然我可以从正常的互联网浏览器中访问该页面,但在我的程序中无法访问。

有没有人能指导我正确的方向?

Script Error


3
请在第358行上贴出错误所涉及的代码。我们无法心灵感应,如果没有看到代码,我们就无法确定问题所在。 - DGibbs
- imrdnck
你已经尝试过 webBrowser.ScriptErrorsSuppressed = true; 吗? - jomsk1e
是的,页面无法加载。 - imrdnck
1
我对这些都很新,通过试错学习,所以如果我提出问题不正确,请不要咬我的头.....Dgibbs。 - imrdnck
显示剩余3条评论
6个回答

20

根据这个链接中的回答:

你只需要加入这一行代码:

webBrowser.ScriptErrorsSuppressed = true;

这对我有用。我正在使用带有 .net framework 4.6.1 的 vs 2017。 - SainathDK
基于SPA的网页无法正确地呈现。 - iAmV
不行!“脚本错误抑制”这个词表达了它自己!它抑制脚本!就像你忽略一个问题而不是解决它。这实际上有助于不看到那些烦人的“错误消息”对话框;然而,它阻止了脚本的运行,因此,页面将无法正确加载。 - Saffa Seraj

14
即使使用版本11,集成的Internet Explorer WebBrowser控件也经常出现脚本错误。现代网站大量依赖于庞大的JavaScript文件和动态渲染。只需观察页面在常规浏览器中的加载情况,就可以看到这一点。有时该控件无法胜任。
您可能想尝试一些替代浏览器控件。不能保证它们能在任何控件上工作,但至少可以尝试一下。
  • Awesomium:最初基于Chromium。我不知道它们是否仍然集成了Chromium更改,或者是否已经朝着自己的方向发展。对于个人使用以及商业使用收益不足10万美元的用户来说是免费的。
  • DotNetBrowser:将基于Chromium的WPF / WinForms组件嵌入到.NET应用程序中,以显示使用HTML5、CSS3、JavaScript、Silverlight等构建的现代网页。
  • geckofx:一个开源组件,用于在.NET应用程序中嵌入Mozilla Gecko(Firefox)。
  • Xilium.CefGlue:由Marshall A. Greenblatt开发的.NET/Mono绑定,用于The Chromium Embedded Framework(CEF)。
  • BrowseEmAll:BrowseEmAll.Cef(Chrome)、BrowseEmAll.Gecko(Firefox)、BrowseEmAll Core API(Chrome、Firefox、IE - 商业)

可能还有其他项目,但如果你想走这条路线,这些是一些更受欢迎且活跃的项目,这应该可以为你提供一个开始。


@imrdnck 不用谢。虽然它使用IE11,但很遗憾框架浏览器不起作用,但除了去找专门制作功能替代品的人之外,我们真的无能为力。 :-) - Chris Fannin

7

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://learn.microsoft.com/en-gb/archive/blogs/patricka/controlling-webbrowser-control-compatibility


0

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

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

参考:

在WebBrowser控件中使用Internet Explorer的最新版本


0

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


注册表参数在哪里? - Ali Rasouli

0
  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();
       }
   }

如果您能对您的代码进行一些解释,那将是很好的。 - Nikolai Shevchenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接