【发布时间】:2014-03-26 03:51:01
【问题描述】:
我是 Visual C# 的新手,我正在尝试编写一个自动登录程序。基本上我现在只需要知道 SetAttribute 和 InvokeMember。
为了简化任务,我尝试制作一个将转到 google 的表单,使用 SetAttribute 将查询框更改为用户输入,并使用 InvokeMember 单击“搜索”按钮。但是,当我尝试按顺序运行它们时,代码会忽略 InvokeMember 函数。
这是我的代码:
webBrowser1.Navigate("www.google.com");
while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); }
webBrowser1.Document.GetElementById("q").SetAttribute("value", searchTXT.Text);
//MessageBox.Show(webBrowser1.Document.GetElementById("q").GetAttribute("value"));
webBrowser1.Document.GetElementById("btnK").InvokeMember("click");
它基本上忽略了最后一行。但是,当我取消注释消息框时,它可以工作。当我使用单独的按钮进行点击时,它也可以工作,所以最后一行本身应该没问题。
我认为这是某种延迟问题。因此,在调用 InvokeMember 之前,我必须等待 SetAttribute 完成其工作。我尝试了一个while循环来延迟一些时间,但它没有用。有什么方法可以等待操作完成后再继续?这是我问题的真正原因吗?
非常感谢任何帮助, 提前致谢!
【问题讨论】:
-
不做任何事情的 while 循环将被编译器和/或 jit 优化掉。试试
Thread.Sleep(150); -
它说“当前内容中不存在名称'线程'。”
-
System.Threading.Thread.Sleep(150); -
不,我尝试了 2 秒,但即使它在 SetAttribute 之后,它也会等待 2 秒才能更改谷歌栏。
标签: c# visual-studio-2010 webbrowser-control