日期:2014-05-17  浏览次数:20816 次

WebBorwser自动登陆后判断是否登陆的问题
                webWow.Document.GetElementById("accountName").SetAttribute("value", "1@163.com");
                webWow.Document.GetElementById("password").SetAttribute("value", "1");
                HtmlElement htmlEle = webWow.Document.Forms["form"];
                htmlEle.InvokeMember("submit");

之后页面会有所改变,我尝试通过Document.GetElementById判断有没有出现新的节点
 但是发现Document没有发生变化。貌似只有在DocumentCompleted这个事件里面才能得到最新的Document,这个问题该怎么解决~~

------解决方案--------------------
上面你问的“我再哪里找新的标签啊”这个问题是可以实现在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)很多是把过分花哨的“泥潭”为基础,没有简化工作流概念。