【问题标题】:SetAttribute is too slow, following InvokeMember is ignored by the programSetAttribute 太慢,后面的 InvokeMember 被程序忽略了
【发布时间】: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


【解决方案1】:

最终“System.Threading.Thread.Sleep(150);”没用,我注意到出于某种原因

while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); }

在 Web 浏览器完全加载之前自行终止。为了确保页面被加载,我所做的是创建一个名为“wait”的 bool 变量。然后我把代码改成如下:

wait = true;
webBrowser1.Navigate("www.google.com");
while (wait==true) { Application.DoEvents(); }
webBrowser1.Document.GetElementById("q").SetAttribute("value", searchTXT.Text);
//MessageBox.Show(webBrowser1.Document.GetElementById("q").GetAttribute("value"));
webBrowser1.Document.GetElementById("btnK").InvokeMember("click");

然后我双击 webBrowser1 并将其“完成”事件设置为 wait=false;这对我来说非常好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    相关资源
    最近更新 更多