webWow.Document.GetElementById("accountName").SetAttribute("value", "[email protected]");
                webWow.Document.GetElementById("password").SetAttribute("value", "1");
                HtmlElement htmlEle = webWow.Document.Forms["form"];
                htmlEle.InvokeMember("submit");
之后页面会有所改变,我尝试通过Document.GetElementById判断有没有出现新的节点
 但是发现Document没有发生变化。貌似只有在DocumentCompleted这个事件里面才能得到最新的Document,这个问题该怎么解决~~

解决方案 »

  1.   

    加上一个延迟看看。
    while (webbrowser.IsBusy)
    {
        Thread.Sleep(100);
        Application.DoEvents();
    }
      

  2.   

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs arg)
    {
        if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
        {
            在这里进行你的处理
        }
    }
      

  3.   

    我想根据提交之后的页面中的标签判断结果,正确的话就导出并注销进行下个账号的测试,错误的就直接进行下个测试,htmlEle.InvokeMember("submit");之后不知道怎么写了
      

  4.   

    成功之后,页面总有特征的HTML标签吧。
      

  5.   

    这个我知道,但是htmlEle.InvokeMember("submit")之后我再哪里找新的标签啊
      

  6.   

    webBrowser1_DocumentCompleted 里重新对document进行搜索嘛
      

  7.   


    那就不适合这种方式,做账号检测器用HttpWebRequest模拟登录,这样速度快准确
      

  8.   

    给你简单说一下吧。比如说你有一个“操作步骤”的序列private List<Action> Steps;那么你就可以按照步骤调用各个过程,例如private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs arg)
    {
        if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
        {
            if(Steps!=null && Steps.Count>0)
            {
                var proc = Steps[0];
                Steps.RemoveAt(0);
                proc();
            }
        }
    }例如在点击某个Start按钮事件中你可以写private void button1_Click(object sender, EventArgs e)
    {
        webBrowser1.DocumentCompleted -= webBrowser1_DocumentCompleted;
        webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;
        Steps = new List<Action>{ a, b, c, d};
        webBrowser1.Navigate("http://www.test.com/index.aspx");
    }private void a()
    {
        .....
    }private void b()
    {
        .....
    }private void c()
    {
        .....
    }private void d()
    {
        .....
    }
      

  9.   

    上面你问的“我再哪里找新的标签啊”这个问题是可以实现在a、b、c、d中去相应的那一个步骤中去查找标签的。
    我们也可以非常简单地拥有一个完美的自动机工作流设计。例如每一个操作步骤都是一个“规则”public  class Rule
    {
        public Func<bool> CheckCondition;      //判断此规则的执行条件是否具备
        public Action<> TakeConclusion;        //执行此规则,使得整个执行环境推进到下一个状态
    }
    那么我们的执行机制就可以写为private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs arg)
    {
        if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
        {
            var r = Rules.FirstOrDefault(x => x.CheckCondition());  //找到一个可以执行条件具备了的规则
            if (r != null)
                r.TakeConclusion(arg);  //执行这个规则的结论部分
        }
    }
    当所有规则的CheckCondition函数都返回false,此时要么是执行成功、要么是失败,总之是没有规则适配于引擎调用了。你说问的“我再哪里找新的标签啊”可以实现在相应某规则的CheckCondition中的。当然一个真正的自动工作流最好可以随机适配规则private static Random Rnd = new Random();private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs arg)
    {
        if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
        {
            var r = Rules.OrderBy(x => Rnd.Next()).FirstOrDefault(x => x.CheckCondition());
            if (r != null)
                r.TakeConclusion(arg);
        }
    }
    或者不是随机排序,而是按照某种“权重”来对规则排序,再调用规则。
    这是很简单的工作流自动调用引擎。而那种八股的玩意儿(例如微软花费了巨大代价开发的WF)很多是把过分花哨的“泥潭”为基础,没有简化工作流概念。