ปิดใช้งานข้อผิดพลาดของ JavaScript ในการควบคุมเว็บเบราว์เซอร์


105

ฉันกำลังพัฒนาแอปพลิเคชัน windows ด้วยการควบคุมเว็บเบราว์เซอร์ที่นำทางไปยังไซต์แชร์พอยต์
ปัญหาของฉันคือฉันได้รับข้อผิดพลาดของ JavaScript

ฉันจะปิดใช้งานข้อผิดพลาด JavaScript ได้อย่างไร ฉันไม่ต้องการให้พวกเขาปรากฏขึ้น


อันนี้บันทึกวันของฉัน Reallly ...
NANDAKUMAR

คำตอบ:


219
webBrowser.ScriptErrorsSuppressed = true;

2
ขอบคุณเพื่อนช่วยฉันได้มาก!
TheGateKeeper

7
สำหรับเร็กคอร์ดภายใต้ฝากระโปรงคุณสมบัตินี้ทำสิ่งนี้ AxIWebBrowser2.Silent = true;
redcalx

12
ควรจะเพิ่มว่า this.AxIWebBrowser2.Silent = true ยับยั้งป๊อปอัปทั้งหมดไม่ใช่แค่ข้อผิดพลาดของสคริปต์ดังนั้น WebBrowser.ScriptErrorsSuppressd จึงดูเหมือนจะตั้งชื่อไม่ถูกต้อง
redcalx

1
ใครช่วยบอกทีว่าฉันควรเขียนโค้ดในบรรทัดนี้ที่ไหน ช่วยด้วย!!
Har devgun

1
การดำเนินการนี้จะลบป๊อปอัปทั้งหมดรวมถึงกล่องล็อกอิน ดีที่สุดคือใช้สิ่งที่ redclax ทำ
Goozo

53

การดำเนินการนี้จะปิดใช้งานข้อผิดพลาดของสคริปต์และยังปิดใช้งานหน้าต่างอื่น ๆ เช่นหน้าต่างการเข้าสู่ระบบ NTLM หรือหน้าต่างยอมรับใบรับรองไคลเอ็นต์ ด้านล่างนี้จะระงับเฉพาะข้อผิดพลาดของจาวาสคริปต์

// Hides script errors without hiding other dialog boxes.
private void SuppressScriptErrorsOnly(WebBrowser browser)
{
    // Ensure that ScriptErrorsSuppressed is set to false.
    browser.ScriptErrorsSuppressed = false;

    // Handle DocumentCompleted to gain access to the Document object.
    browser.DocumentCompleted +=
        new WebBrowserDocumentCompletedEventHandler(
            browser_DocumentCompleted);
}

private void browser_DocumentCompleted(object sender, 
    WebBrowserDocumentCompletedEventArgs e)
{
    ((WebBrowser)sender).Document.Window.Error += 
        new HtmlElementErrorEventHandler(Window_Error);
}

private void Window_Error(object sender, 
    HtmlElementErrorEventArgs e)
{
    // Ignore the error and suppress the error dialog box. 
    e.Handled = true;
}

สิ่งนี้ควรมีการโหวตเพิ่มมากขึ้นแน่นอนว่าเป็นวิธีที่ถูกต้อง โบนัสสำหรับความสามารถในการบันทึกข้อผิดพลาดหรือแสดงการแจ้งเตือนของคุณเองแทนที่จะไม่รู้ว่าเคยเกิดขึ้น (เช่นสำหรับแอปพลิเคชันคีออสก์)
Mike Marynowski

4
ในการทดสอบของฉันฉันพบว่ามีกล่องโต้ตอบข้อผิดพลาดของสคริปต์ปรากฏขึ้นก่อนที่เหตุการณ์ DocumentCompleted จะเริ่มทำงาน อย่างไรก็ตามหากมีการแนบตัวจัดการข้อผิดพลาด WebBrowser.Document.Window.Error เป็นการตอบสนองต่อเหตุการณ์ Navigated และ FileDownloaded ส่วนใหญ่ถ้าไม่สามารถระงับกล่องโต้ตอบข้อผิดพลาดของสคริปต์ได้ทั้งหมด (FileDownloaded จัดการสถานการณ์ส่วนใหญ่ยกเว้นตัวอย่างเช่น WebBrowser.GoBack ซึ่งจัดการโดย Navigated การนำทางเพียงอย่างเดียวจะพลาดหน้าที่กำลังรีเฟรช)
Ej

@ จ. ดีฉันมีปัญหาที่จับข้อผิดพลาด JavaScript ไม่ได้ทั้งหมดและนี่อาจจะช่วยแก้ปัญหาได้คุณจะมีตัวอย่างวิธีการใช้งานโดยบังเอิญหรือไม่
Jamiegs

5
นี่คือสิ่งที่ฉันใช้: pastebin.com/UThKifw8แม้ว่าเราจะต้องให้ผู้ใช้อัปเกรดเป็น IE8 ก่อนที่กล่องโต้ตอบจะหายไปอย่างสมบูรณ์
Ej.

FYI ฉันไม่สามารถใช้โซลูชันนี้ได้เนื่องจากหน้า HTML มีชุดเฟรมและเฟรมและสิ่งนี้ทำให้การตรวจสอบความปลอดภัยแบบข้ามเฟรมทำให้เกิดข้อยกเว้น (ดูคุณสมบัติ WebBrowser.Document getter พ่น UnauthorizedAccessException )
redcalx

13

ไม่มีโซลูชันใดข้างต้นที่เหมาะกับสถานการณ์ของฉันการจัดการเหตุการณ์. Navigated และ. FileDownload ดูเหมือนจะเหมาะสม แต่การเข้าถึง WebBrowser คุณสมบัติเอกสารโยน UnauthorizedAccessException ซึ่งเกิดจากความปลอดภัยของการเขียนสคริปต์ข้ามเฟรม (เนื้อหาเว็บของเรามีเฟรม - ทั้งหมดบน โดเมน / ที่อยู่เดียวกัน แต่เฟรมมีช่องโหว่ความปลอดภัยของตัวเองที่ถูกบล็อก)

วิธีแก้ปัญหาที่ได้ผลคือการแทนที่ IOleCommandTarget และตรวจจับคำสั่งข้อผิดพลาดของสคริปต์ในระดับนั้น นี่คือคลาสย่อยของ WebBrowser เพื่อให้บรรลุสิ่งนี้:

/// <summary>
/// Subclassed WebBrowser that suppresses error pop-ups.
/// 
/// Notes.
/// ScriptErrorsSuppressed property is not used because this actually suppresses *all* pop-ups.
/// 
/// More info at:
/// http://stackoverflow.com/questions/2476360/disable-javascript-error-in-webbrowser-control
/// </summary>
public class WebBrowserEx : WebBrowser
{
    #region Constructor

    /// <summary>
    /// Default constructor.
    /// Initialise browser control and attach customer event handlers.
    /// </summary>
    public WebBrowserEx()
    {
        this.ScriptErrorsSuppressed = false;
    }

    #endregion

    #region Overrides

    /// <summary>
    /// Override to allow custom script error handling.
    /// </summary>
    /// <returns></returns>
    protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
    {
        return new WebBrowserSiteEx(this);
    }

    #endregion

    #region Inner Class [WebBrowserSiteEx]

    /// <summary>
    /// Sub-class to allow custom script error handling.
    /// </summary>
    protected class WebBrowserSiteEx : WebBrowserSite, NativeMethods.IOleCommandTarget
    {
        /// <summary>
        /// Default constructor.
        /// </summary>
        public WebBrowserSiteEx(WebBrowserEx webBrowser) : base (webBrowser)
        {   
        }

        /// <summary>Queries the object for the status of one or more commands generated by user interface events.</summary>
        /// <param name="pguidCmdGroup">The GUID of the command group.</param>
        /// <param name="cCmds">The number of commands in <paramref name="prgCmds" />.</param>
        /// <param name="prgCmds">An array of OLECMD structures that indicate the commands for which the caller needs status information. This method fills the <paramref name="cmdf" /> member of each structure with values taken from the OLECMDF enumeration.</param>
        /// <param name="pCmdText">An OLECMDTEXT structure in which to return name and/or status information of a single command. This parameter can be null to indicate that the caller does not need this information.</param>
        /// <returns>This method returns S_OK on success. Other possible return values include the following.
        /// E_FAIL The operation failed.
        /// E_UNEXPECTED An unexpected error has occurred.
        /// E_POINTER The <paramref name="prgCmds" /> argument is null.
        /// OLECMDERR_E_UNKNOWNGROUP The <paramref name="pguidCmdGroup" /> parameter is not null but does not specify a recognized command group.</returns>
        public int QueryStatus(ref Guid pguidCmdGroup, int cCmds, NativeMethods.OLECMD prgCmds, IntPtr pCmdText)
        {
            if((int)NativeMethods.OLECMDID.OLECMDID_SHOWSCRIPTERROR == prgCmds.cmdID)
            {   // Do nothing (suppress script errors)
                return NativeMethods.S_OK;
            }

            // Indicate that command is unknown. The command will then be handled by another IOleCommandTarget.
            return NativeMethods.OLECMDERR_E_UNKNOWNGROUP;
        }

        /// <summary>Executes the specified command.</summary>
        /// <param name="pguidCmdGroup">The GUID of the command group.</param>
        /// <param name="nCmdID">The command ID.</param>
        /// <param name="nCmdexecopt">Specifies how the object should execute the command. Possible values are taken from the <see cref="T:Microsoft.VisualStudio.OLE.Interop.OLECMDEXECOPT" /> and <see cref="T:Microsoft.VisualStudio.OLE.Interop.OLECMDID_WINDOWSTATE_FLAG" /> enumerations.</param>
        /// <param name="pvaIn">The input arguments of the command.</param>
        /// <param name="pvaOut">The output arguments of the command.</param>
        /// <returns>This method returns S_OK on success. Other possible return values include 
        /// OLECMDERR_E_UNKNOWNGROUP The <paramref name="pguidCmdGroup" /> parameter is not null but does not specify a recognized command group.
        /// OLECMDERR_E_NOTSUPPORTED The <paramref name="nCmdID" /> parameter is not a valid command in the group identified by <paramref name="pguidCmdGroup" />.
        /// OLECMDERR_E_DISABLED The command identified by <paramref name="nCmdID" /> is currently disabled and cannot be executed.
        /// OLECMDERR_E_NOHELP The caller has asked for help on the command identified by <paramref name="nCmdID" />, but no help is available.
        /// OLECMDERR_E_CANCELED The user canceled the execution of the command.</returns>
        public int Exec(ref Guid pguidCmdGroup, int nCmdID, int nCmdexecopt, object[] pvaIn, int pvaOut)
        {
            if((int)NativeMethods.OLECMDID.OLECMDID_SHOWSCRIPTERROR == nCmdID)
            {   // Do nothing (suppress script errors)
                return NativeMethods.S_OK;
            }

            // Indicate that command is unknown. The command will then be handled by another IOleCommandTarget.
            return NativeMethods.OLECMDERR_E_UNKNOWNGROUP;
        }
    }

    #endregion
}

~

/// <summary>
/// Native (unmanaged) methods, required for custom command handling for the WebBrowser control.
/// </summary>
public static class NativeMethods
{
    /// From docobj.h
    public const int OLECMDERR_E_UNKNOWNGROUP = -2147221244;

    /// <summary>
    /// From Microsoft.VisualStudio.OLE.Interop (Visual Studio 2010 SDK).
    /// </summary>
    public enum OLECMDID
    {
        /// <summary />
        OLECMDID_OPEN = 1,
        /// <summary />
        OLECMDID_NEW,
        /// <summary />
        OLECMDID_SAVE,
        /// <summary />
        OLECMDID_SAVEAS,
        /// <summary />
        OLECMDID_SAVECOPYAS,
        /// <summary />
        OLECMDID_PRINT,
        /// <summary />
        OLECMDID_PRINTPREVIEW,
        /// <summary />
        OLECMDID_PAGESETUP,
        /// <summary />
        OLECMDID_SPELL,
        /// <summary />
        OLECMDID_PROPERTIES,
        /// <summary />
        OLECMDID_CUT,
        /// <summary />
        OLECMDID_COPY,
        /// <summary />
        OLECMDID_PASTE,
        /// <summary />
        OLECMDID_PASTESPECIAL,
        /// <summary />
        OLECMDID_UNDO,
        /// <summary />
        OLECMDID_REDO,
        /// <summary />
        OLECMDID_SELECTALL,
        /// <summary />
        OLECMDID_CLEARSELECTION,
        /// <summary />
        OLECMDID_ZOOM,
        /// <summary />
        OLECMDID_GETZOOMRANGE,
        /// <summary />
        OLECMDID_UPDATECOMMANDS,
        /// <summary />
        OLECMDID_REFRESH,
        /// <summary />
        OLECMDID_STOP,
        /// <summary />
        OLECMDID_HIDETOOLBARS,
        /// <summary />
        OLECMDID_SETPROGRESSMAX,
        /// <summary />
        OLECMDID_SETPROGRESSPOS,
        /// <summary />
        OLECMDID_SETPROGRESSTEXT,
        /// <summary />
        OLECMDID_SETTITLE,
        /// <summary />
        OLECMDID_SETDOWNLOADSTATE,
        /// <summary />
        OLECMDID_STOPDOWNLOAD,
        /// <summary />
        OLECMDID_ONTOOLBARACTIVATED,
        /// <summary />
        OLECMDID_FIND,
        /// <summary />
        OLECMDID_DELETE,
        /// <summary />
        OLECMDID_HTTPEQUIV,
        /// <summary />
        OLECMDID_HTTPEQUIV_DONE,
        /// <summary />
        OLECMDID_ENABLE_INTERACTION,
        /// <summary />
        OLECMDID_ONUNLOAD,
        /// <summary />
        OLECMDID_PROPERTYBAG2,
        /// <summary />
        OLECMDID_PREREFRESH,
        /// <summary />
        OLECMDID_SHOWSCRIPTERROR,
        /// <summary />
        OLECMDID_SHOWMESSAGE,
        /// <summary />
        OLECMDID_SHOWFIND,
        /// <summary />
        OLECMDID_SHOWPAGESETUP,
        /// <summary />
        OLECMDID_SHOWPRINT,
        /// <summary />
        OLECMDID_CLOSE,
        /// <summary />
        OLECMDID_ALLOWUILESSSAVEAS,
        /// <summary />
        OLECMDID_DONTDOWNLOADCSS,
        /// <summary />
        OLECMDID_UPDATEPAGESTATUS,
        /// <summary />
        OLECMDID_PRINT2,
        /// <summary />
        OLECMDID_PRINTPREVIEW2,
        /// <summary />
        OLECMDID_SETPRINTTEMPLATE,
        /// <summary />
        OLECMDID_GETPRINTTEMPLATE
    }

    /// <summary>
    /// From Microsoft.VisualStudio.Shell (Visual Studio 2010 SDK).
    /// </summary>
    public const int S_OK = 0;

    /// <summary>
    /// OLE command structure.
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public class OLECMD
    {
        /// <summary>
        /// Command ID.
        /// </summary>
        [MarshalAs(UnmanagedType.U4)]
        public int cmdID;
        /// <summary>
        /// Flags associated with cmdID.
        /// </summary>
        [MarshalAs(UnmanagedType.U4)]
        public int cmdf;
    }

    /// <summary>
    /// Enables the dispatching of commands between objects and containers.
    /// </summary>
    [ComVisible(true), Guid("B722BCCB-4E68-101B-A2BC-00AA00404770"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [ComImport]
    public interface IOleCommandTarget
    {
        /// <summary>Queries the object for the status of one or more commands generated by user interface events.</summary>
        /// <param name="pguidCmdGroup">The GUID of the command group.</param>
        /// <param name="cCmds">The number of commands in <paramref name="prgCmds" />.</param>
        /// <param name="prgCmds">An array of <see cref="T:Microsoft.VisualStudio.OLE.Interop.OLECMD" /> structures that indicate the commands for which the caller needs status information.</param>
        /// <param name="pCmdText">An <see cref="T:Microsoft.VisualStudio.OLE.Interop.OLECMDTEXT" /> structure in which to return name and/or status information of a single command. This parameter can be null to indicate that the caller does not need this information.</param>
        /// <returns>This method returns S_OK on success. Other possible return values include the following.
        /// E_FAIL The operation failed.
        /// E_UNEXPECTED An unexpected error has occurred.
        /// E_POINTER The <paramref name="prgCmds" /> argument is null.
        /// OLECMDERR_E_UNKNOWNGROUPThe <paramref name="pguidCmdGroup" /> parameter is not null but does not specify a recognized command group.</returns>
        [PreserveSig]
        [return: MarshalAs(UnmanagedType.I4)]
        int QueryStatus(ref Guid pguidCmdGroup, int cCmds, [In] [Out] NativeMethods.OLECMD prgCmds, [In] [Out] IntPtr pCmdText);

        /// <summary>Executes the specified command.</summary>
        /// <param name="pguidCmdGroup">The GUID of the command group.</param>
        /// <param name="nCmdID">The command ID.</param>
        /// <param name="nCmdexecopt">Specifies how the object should execute the command. Possible values are taken from the <see cref="T:Microsoft.VisualStudio.OLE.Interop.OLECMDEXECOPT" /> and <see cref="T:Microsoft.VisualStudio.OLE.Interop.OLECMDID_WINDOWSTATE_FLAG" /> enumerations.</param>
        /// <param name="pvaIn">The input arguments of the command.</param>
        /// <param name="pvaOut">The output arguments of the command.</param>
        /// <returns>This method returns S_OK on success. Other possible return values include 
        /// OLECMDERR_E_UNKNOWNGROUP The <paramref name="pguidCmdGroup" /> parameter is not null but does not specify a recognized command group.
        /// OLECMDERR_E_NOTSUPPORTED The <paramref name="nCmdID" /> parameter is not a valid command in the group identified by <paramref name="pguidCmdGroup" />.
        /// OLECMDERR_E_DISABLED The command identified by <paramref name="nCmdID" /> is currently disabled and cannot be executed.
        /// OLECMDERR_E_NOHELP The caller has asked for help on the command identified by <paramref name="nCmdID" />, but no help is available.
        /// OLECMDERR_E_CANCELED The user canceled the execution of the command.</returns>
        [PreserveSig]
        [return: MarshalAs(UnmanagedType.I4)]
        int Exec(ref Guid pguidCmdGroup, int nCmdID, int nCmdexecopt, [MarshalAs(UnmanagedType.LPArray)] [In] object[] pvaIn, int pvaOut);
    }
}

ขอบคุณขอบคุณขอบคุณ. จากนั้นวิธีแก้ปัญหาที่ใช้งานได้เท่านั้นในขณะนี้ ขอบคุณมาก: D.
Beniamin

จนถึง IE เวอร์ชั่นต่อไป !!
redcalx

ฉันเห็น. และ IE เวอร์ชันใดที่วิธีนี้รองรับ?
Beniamin

ฉันทำงานกับ IE10 และ 11 แต่ความกังวลหลักของฉันคือสิ่งที่เกิดขึ้นกับการเปลี่ยน IE - Microsoft Edge
redcalx

1
จะไม่มีอะไรเกิดขึ้นกับ Microsoft Edge เนื่องจาก Microsoft จะไม่ให้คุณฝัง Edge ในแอป WinForms เพื่อพยายามบังคับให้คุณสร้างแอปสำหรับแพลตฟอร์ม "Universal" ที่ล็อกไว้ใหม่แทน - (ค้นหาembedในหน้านี้ - dev.windows.com/en-us/microsoft-edge/platform/faq/apps-engine )
Wayne Bloss


1

นี่คือทางเลือกอื่น:

class extendedWebBrowser : WebBrowser
{
    /// <summary>
    /// Default constructor which will make the browser to ignore all errors
    /// </summary>
    public extendedWebBrowser()
    {
        this.ScriptErrorsSuppressed = true;

        FieldInfo field = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);
        if (field != null)
        {
             object axIWebBrowser2 = field.GetValue(this);
             axIWebBrowser2.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, axIWebBrowser2, new object[] { true });
        }
    }
}

0

ฉันเพิ่งพบสิ่งนี้:

 private static bool TrySetSuppressScriptErrors(WebBrowser webBrowser, bool value)
    {
        FieldInfo field = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);
        if (field != null)
        {
            object axIWebBrowser2 = field.GetValue(webBrowser);
            if (axIWebBrowser2 != null)
            {
                axIWebBrowser2.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, axIWebBrowser2, new object[] { value });
                return true;
            }
        }

        return false;
    }

ตัวอย่างการใช้งานเพื่อตั้งค่า webBrowser เป็น Sile: TrySetSuppressScriptErrors (webBrowser, true)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.