Comment puis-je supprimer les erreurs de script lors de l’utilisation du contrôle WPF WebBrowser?

J’ai une application WPF qui utilise le contrôle WPF WebBrowser pour afficher des pages Web intéressantes à nos développeurs sur un écran plat (comme un fil d’actualité).

Le problème est que je reçois de temps en temps une erreur de script HTML qui affiche un message d’erreur d’IE méchant demandant si je voudrais “arrêter d’exécuter des scripts sur cette page”. Est-il possible de supprimer cette vérification d’erreur?

REMARQUE: J’ai déjà désactivé le débogage de script dans les parameters IE.

Le problème est que WPF WebBrowser n’a pas implémenté cette propriété comme dans le contrôle 2.0.

Votre meilleur pari est d’utiliser un WindowsFormsHost dans votre application WPF et d’utiliser la propriété WebBrowser 2.0: SuppressScriptErrors . Même dans ce cas, vous aurez besoin de la confiance de l’application pour ce faire.

Pas ce qu’on pourrait appeler idéal, mais c’est à peu près la seule option actuellement.

Voici une solution que je viens de faire avec reflection. Résout le problème 🙂 Je l’exécute à l’événement Navigated, car il semble que l’object ActiveX n’est pas disponible jusque-là.

Ce qu’il fait, c’est de définir la propriété .Silent sur l’object ActiveX sous-jacent. Ce qui est identique à la propriété .ScriptErrorsSuppressed qui est l’équivalent des formulaires Windows.

  public void HideScriptErrors(WebBrowser wb, bool Hide) { FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic); if (fiComWebBrowser == null) return; object objComWebBrowser = fiComWebBrowser.GetValue(wb); if (objComWebBrowser == null) return; objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { Hide }); } 

Une meilleure version qui peut être exécutée à tout moment et non après l’événement .Navigated:

 public void HideScriptErrors(WebBrowser wb, bool hide) { var fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic); if (fiComWebBrowser == null) return; var objComWebBrowser = fiComWebBrowser.GetValue(wb); if (objComWebBrowser == null) { wb.Loaded += (o, s) => HideScriptErrors(wb, hide); //In case we are to early return; } objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { hide }); } 

En cas de problème avec le deuxième exemple, essayez de permuter wb.Loaded avec wb.Navigated.

Juste trouvé d’ une autre question , c’est élégant et fonctionne très bien.

 dynamic activeX = this.webBrowser1.GetType().InvokeMember("ActiveXInstance", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic, null, this.webBrowser1, new object[] { }); activeX.Silent = true; 

Je voulais append ceci en tant que commentaire à la réponse de @Alkampfer, mais je n’ai pas assez de réputation. Cela fonctionne pour moi (Windows 8.1, NET 4.5):

  window.Browser.LoadCompleted.Add(fun _ -> window.Browser.Source <- new System.Uri("javascript:window.onerror=function(msg,url,line){return true;};void(0);")) 

Cet exemple de code est écrit en F #, mais c'est assez clair.

J’ai également trouvé un moyen intéressant de désactiver les erreurs JavaScript. Mais vous devez utiliser au moins .Net Framework 4.0 en raison de l’utilisation d’un type dynamic élégant.

Vous devez vous abonner à l’événement LoadCompleted de l’élément WebBrowser:

  

Après cela, vous devez écrire un gestionnaire d’événement qui ressemble à celui-ci:

  void Browser_OnLoadCompleted(object sender, NavigationEventArgs e) { var browser = sender as WebBrowser; if (browser == null || browser.Document == null) return; dynamic document = browser.Document; if (document.readyState != "complete") return; dynamic script = document.createElement("script"); script.type = @"text/javascript"; script.text = @"window.onerror = function(msg,url,line){return true;}"; document.head.appendChild(script); } 

Vérifiez le code ci-dessous pour supprimer les erreurs de script pour le contrôle du navigateur WPF.

  public MainWindow { InitializeComponent(); WebBrowserControlView.Navigate(new Uri("https://www.hotmail.com")); //The below checks for script errors. ViewerWebBrowserControlView.Navigated += ViewerWebBrowserControlView_Navigated; } void ViewerWebBrowserControlView_Navigated(object sender, NavigationEventArgs e) { BrowserHandler.SetSilent(ViewerWebBrowserControlView, true); // make it silent } public static class BrowserHandler { private const ssortingng IWebBrowserAppGUID = "0002DF05-0000-0000-C000-000000000046"; private const ssortingng IWebBrowser2GUID = "D30C1661-CDAF-11d0-8A3E-00C04FC9E26E"; public static void SetSilent(System.Windows.Controls.WebBrowser browser, bool silent) { if (browser == null) MessageBox.Show("No Internet Connection"); // get an IWebBrowser2 from the document IOleServiceProvider sp = browser.Document as IOleServiceProvider; if (sp != null) { Guid IID_IWebBrowserApp = new Guid(IWebBrowserAppGUID); Guid IID_IWebBrowser2 = new Guid(IWebBrowser2GUID); object webBrowser; sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out webBrowser); if (webBrowser != null) { webBrowser.GetType().InvokeMember("Silent", BindingFlags.Instance | BindingFlags.Public | BindingFlags.PutDispProperty, null, webBrowser, new object[] { silent }); } } } } [ComImport, Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IOleServiceProvider { [PreserveSig] int QueryService([In] ref Guid guidService, [In] ref Guid riid, [MarshalAs(UnmanagedType.IDispatch)] out object ppvObject); } 

Considérant que, si vous utilisez le navigateur Web Winforms avec l’hôte winforms .. vous avez une propriété “SuppressScriptErrors”, définissez-la sur true

     

J’ai ce problème dans le passé et finalement résolu avec une injection d’un script Javascript qui supprime la gestion des erreurs. J’espère que cela pourrait vous aider aussi.

Désactiver les erreurs Javascript dans WEbBrowsercontrol

vous pouvez utiliser cette astuce

vb.net

 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Ssortingng, ByVal lpWindowName As Ssortingng) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer Private Const WM_CLOSE As Short = &H10s 

et appelle la dernière lib:

  dim hwnd dim vreturnvalue hwnd = FindWindow(vbNullSsortingng,"script error") if hwnd<>0 then vreturnvalue = SendMessage(hwnd, WM_CLOSE, &O0s, &O0s) 

Il existe une autre implémentation non loin de celle de Wolf5, mais qui ne repose pas sur un champ privé de classe WebBrowser, disponible ici sur le contrôle SO: WPF WebBrowser – comment supprimer les erreurs de script?