110,545
社区成员
发帖
与我相关
我的任务
分享
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");
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)很多是把过分花哨的“泥潭”为基础,没有简化工作流概念。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()
{
.....
}