WebBorwser自动登陆后判断是否登陆的问题

violet_day 2013-02-12 08:58:33
                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,这个问题该怎么解决~~
...全文
1816 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
violet_day 2013-02-14
  • 打赏
  • 举报
回复
引用 7 楼 fangxinggood 的回复:
成功之后,页面总有特征的HTML标签吧。
这个我知道,但是htmlEle.InvokeMember("submit")之后我再哪里找新的标签啊
机器人 2013-02-14
  • 打赏
  • 举报
回复
成功之后,页面总有特征的HTML标签吧。
violet_day 2013-02-14
  • 打赏
  • 举报
回复
引用 13 楼 sp1234 的回复:
上面你问的“我再哪里找新的标签啊”这个问题是可以实现在a、b、c、d中去相应的那一个步骤中去查找标签的。 我们也可以非常简单地拥有一个完美的自动机工作流设计。例如每一个操作步骤都是一个“规则”C# code?12345public class Rule{ public Func<bool> CheckCondition; //判断此规则的执行条……
谢谢,每次问问题都能看到你耐心解释,太感动了~~~
  • 打赏
  • 举报
回复
上面你问的“我再哪里找新的标签啊”这个问题是可以实现在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)很多是把过分花哨的“泥潭”为基础,没有简化工作流概念。
  • 打赏
  • 举报
回复
给你简单说一下吧。比如说你有一个“操作步骤”的序列
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()
{
    .....
}
  • 打赏
  • 举报
回复
引用 8 楼 violet_day 的回复:
这个我知道,但是htmlEle.InvokeMember("submit")之后我再哪里找新的标签啊
我不知道你是什么程度,这个回复其实很难权衡。对于许多初学者,按说我们根本不应该回复那些针对开发人员的模式设计问题。
孤零落叶寒 2013-02-14
  • 打赏
  • 举报
回复
引用 4 楼 violet_day 的回复:
引用 3 楼 flyer_ren 的回复:事件发生后判断,或者尝试判断其他内容 我有很多账号和密码要尝试登录的,
那就不适合这种方式,做账号检测器用HttpWebRequest模拟登录,这样速度快准确
机器人 2013-02-14
  • 打赏
  • 举报
回复
webBrowser1_DocumentCompleted 里重新对document进行搜索嘛
孤零落叶寒 2013-02-13
  • 打赏
  • 举报
回复
事件发生后判断,或者尝试判断其他内容
violet_day 2013-02-13
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs arg) { if (webBrowser1.ReadyState == WebBrowserReadyState.Complete) { 在这……
我想根据提交之后的页面中的标签判断结果,正确的话就导出并注销进行下个账号的测试,错误的就直接进行下个测试,htmlEle.InvokeMember("submit");之后不知道怎么写了
  • 打赏
  • 举报
回复
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs arg) { if (webBrowser1.ReadyState == WebBrowserReadyState.Complete) { 在这里进行你的处理 } }
iamnottrue888 2013-02-13
  • 打赏
  • 举报
回复
要不把源网址 贴出來?
violet_day 2013-02-13
  • 打赏
  • 举报
回复
引用 3 楼 flyer_ren 的回复:
事件发生后判断,或者尝试判断其他内容
我有很多账号和密码要尝试登录的,
devmiao 2013-02-12
  • 打赏
  • 举报
回复
加上一个延迟看看。 while (webbrowser.IsBusy) { Thread.Sleep(100); Application.DoEvents(); }

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧