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,这个问题该怎么解决~~
webWow.Document.GetElementById("password").SetAttribute("value", "1");
HtmlElement htmlEle = webWow.Document.Forms["form"];
htmlEle.InvokeMember("submit");
之后页面会有所改变,我尝试通过Document.GetElementById判断有没有出现新的节点
但是发现Document没有发生变化。貌似只有在DocumentCompleted这个事件里面才能得到最新的Document,这个问题该怎么解决~~
while (webbrowser.IsBusy)
{
Thread.Sleep(100);
Application.DoEvents();
}
{
if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
{
在这里进行你的处理
}
}
那就不适合这种方式,做账号检测器用HttpWebRequest模拟登录,这样速度快准确
{
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()
{
.....
}
我们也可以非常简单地拥有一个完美的自动机工作流设计。例如每一个操作步骤都是一个“规则”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)很多是把过分花哨的“泥潭”为基础,没有简化工作流概念。