webBrowser1加载网页后
InvokeMember("click")触发单击事件
正常应该不弹出窗口提交
可向在已提交就新弹出个窗口,功能好事触发了单击事件如何像IE那样不弹出窗口

解决方案 »

  1.   

    可以利用win32 API函数实现,不过有一点一定要注意:如果MessageBox的Caption为string.Empty,则比较麻烦,代码如下. 
    1.假设一个窗体中有如下代码: public partial class Form1 : Form  
        {  
            public Form1()  
            {  
                InitializeComponent();  
            }  
      
            private void button1_Click(object sender, EventArgs e)  
            {  
                DialogResult result = MessageBox.Show(this, "test", string.Empty, MessageBoxButtons.YesNo, MessageBoxIcon.Information);  
                if (result == DialogResult.Yes)  
                {  
                    this.DialogResult = DialogResult.Yes;  
                    this.Hide();  
                }  
                else  
                {    
                    this.DialogResult = DialogResult.No;                      
                    this.Hide();              
                }  
            }  
        }  
      2.如果我想测试这段代码,因为有消息框,必须点击按钮才可以让剩下的代码(红色标识)继续运行,否则代码覆盖率太低,怎么办? 
    3.解决方案:在vs 2008下测试通过 
    [TestClass]  
        public class UnitTest1  
        {  
            private const uint BM_CLICK = 0xF5;  
            private enum GetWindowCmd : uint  
            {  
                GW_HWNDFIRST = 0,  
                GW_HWNDLAST = 1,  
                GW_HWNDNEXT = 2,  
                GW_HWNDPREV = 3,  
                GW_OWNER = 4,  
                GW_CHILD = 5,  
                GW_ENABLEDPOPUP = 6  
            }  
            public UnitTest1()  
            {  
                //  
                //TODO: 在此处添加构造函数逻辑  
                //  
            }  
      
            private TestContext testContextInstance;  
            private Form1 form1;  
            private System.Timers.Timer timer;  
            private IntPtr frmHandler;  
            /// <summary>  
            ///获取或设置测试上下文,该上下文提供  
            ///有关当前测试运行及其功能的信息。  
            /// </summary>  
            public TestContext TestContext  
            {  
                get  
                {  
                    return testContextInstance;  
                }  
                set  
                {  
                    testContextInstance = value;  
                }  
            }          #region 附加测试属性  
            // 在运行每个测试之前,使用 TestInitialize 来运行代码  
            [TestInitialize()]  
            public void MyTestInitialize()  
            {  
                form1 = new Form1();  
                form1.Show();  
                form1.BringToFront();  
            }  
            //  
            // 在每个测试运行完之后,使用 TestCleanup 来运行代码  
            [TestCleanup()]  
            public void MyTestCleanup() { }  
            //  
            #endregion  
      
            [TestMethod]  
            public void TestMethod1()  
            {  
              //启动一个定时器,用于不断的捕获窗口  
                timer = new System.Timers.Timer();  
                timer.Interval = 100;  
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);  
                timer.Start();  
      
                BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;  
                //利用反射机制调用私有方法,也就是按钮的Click方法  
                MethodInfo methodInfo = form1.GetType().GetMethod("button1_Click", flags, null, new Type[] { typeof(object), typeof(EventArgs) }, null);  
                //得到窗体的句柄  
                frmHandler = form1.Handle;  
                try  
                {  
                    methodInfo.Invoke(form1, new object[] { null, null });  
                }  
                catch (Exception ex)  
                {  
                    MessageBox.Show(ex.Message);  
                    timer.Stop();  
                }  
                timer.Stop();  
                Assert.AreEqual(DialogResult.Yes, form1.DialogResult);  
      
            }  
      
            void timer_Elapsed(object sender, ElapsedEventArgs e)  
            {  
                try  
                {                
                    //取得消息框的句柄  
                    IntPtr handler = GetWindow(frmHandler, (uint)GetWindowCmd.GW_ENABLEDPOPUP);//handler是MessageBox自己的句柄  
                    if (handler != IntPtr.Zero)//不为零说明取得句柄成功  
                    {  
                        //取得消息框中的"是"按钮的句柄  
                        handler = FindWindowEx(handler, 0, "Button", "是(&Y)");//按钮也作为了窗体处理,开始还真没想到可以这么用  
                        //模拟点击按钮  
                        SendMessage(handler, BM_CLICK, 0, 0);  
                    }  
                }  
                catch { }  
      
            }  
              
            [DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)]  
            private static extern IntPtr FindWindowEx(IntPtr hwndParent, uint hwndChildAfter, string lpszClass, string lpszWindow);  
      
            [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]  
            private static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);  
      
            [DllImport("user32.dll", EntryPoint = "GetWindow", SetLastError = true, CharSet = CharSet.Auto)]  
            private static extern IntPtr GetWindow(IntPtr hwnd, uint uCmd);  
        }  
      
      

  2.   

    InvokeMember("click") 是哪个实例做的?
      

  3.   


    HtmlElement btnSubmit = webBrowser1.Document.All[controlName];
    btnSubmit.InvokeMember("click");