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)很多是把过分花哨的“泥潭”为基础,没有简化工作流概念。