InvokeMember("click") webBrowser1加载网页后InvokeMember("click")触发单击事件正常应该不弹出窗口提交可向在已提交就新弹出个窗口,功能好事触发了单击事件如何像IE那样不弹出窗口 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以利用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); } InvokeMember("click") 是哪个实例做的? HtmlElement btnSubmit = webBrowser1.Document.All[controlName];btnSubmit.InvokeMember("click"); C#测试网速 急!!!怎么样一个页面存为txt文件, 如何把datatable.select()返回的[]byte数组显示到DataGridView里? 100分求助,汉字点阵字库的生成! wmi编程里如何设置连接超时的问题,急~~~~~~ C#把SQL导入Oracle 可以执行一个Delegate中的某一个已注册的方法吗? 怎么实现站内产品搜索功能 用js做的定时自动刷新 设置时间是1分钟 为什么第一次加载页面的时候 好象加栽了两次 字符转换问题,谢谢 windows application 应该如何配置sql 数据库权限 c#中static干什么用的?
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);
}
HtmlElement btnSubmit = webBrowser1.Document.All[controlName];
btnSubmit.InvokeMember("click");