使用WebBrowser DocumentCompleted导航URL

时间:2013-12-13 16:02:38

标签: c# winforms webbrowser-control

这是方案

1 - 导航到管理页面。

2 - 输入用户名和密码

3 - 导航到新页面

4 - 填写textareas等中的一些文本并发布。

5 - 重复步骤3和4直到循环结束

下面的代码成功执行了第1步和第2步。但它在加载新页面之前到达第3步并在此行生成错误“对象引用未设置为对象的实例”doc.GetElementById(“title”) .SetAttribute(“value”,“check1”);

我试图在过去3天内实现这一目标,但直到现在才能达到第3步。任何帮助将不胜感激

bool AdminPagework  =false;
bool postnavigationdone =false;
public Form1()
    {
        InitializeComponent();
        webBrowser1.DocumentCompleted +=
  new WebBrowserDocumentCompletedEventHandler(AdminPageCredentials);
        webBrowser1.Navigate("www.website.com/admin");

    }
    private void AdminPageCredentials(object sender, WebBrowserDocumentCompletedEventArgs e)
    {

        if (AdminPagework == false && (webBrowser1.ReadyState ==        WebBrowserReadyState.Complete))
        {
            HtmlDocument doc = webBrowser1.Document;
            doc.GetElementById("login").SetAttribute("value", "ADMIN");
            doc.GetElementById("pass").SetAttribute("value", "123");
            doc.GetElementById("submit").InvokeMember("click");

            AdminPagework = true;

           webBrowser1.DocumentCompleted +=
      new WebBrowserDocumentCompletedEventHandler(RedirectToPostPage);

            webBrowser1.Navigate("http://www.website.com/admin/post.php");
        }

    }
    public void RedirectToPostPage(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        if ((postnavigationdone == false)  && (webBrowser1.ReadyState == WebBrowserReadyState.Complete))

        {
            HtmlDocument doc = webBrowser1.Document;
            doc.GetElementById("title").SetAttribute("value", "check1");
            doc.GetElementById("content").SetAttribute("value", textBox2.Text);
            doc.GetElementById("post-format-video").InvokeMember("click");
            doc.GetElementById("in-category-64").InvokeMember("click");
            webBrowser1.Document.GetElementById("mm").SetAttribute("value", "01");
            webBrowser1.Document.GetElementById("jj").SetAttribute("value", "01");
            webBrowser1.Document.GetElementById("aa").SetAttribute("value", "2013");
            webBrowser1.Document.GetElementById("hh").SetAttribute("value", "01");
            webBrowser1.Document.GetElementById("mm").SetAttribute("value", "01");

            doc.GetElementById("publish").InvokeMember("click");


            postnavigationdone = true;
        }
    }

1 个答案:

答案 0 :(得分:1)

var titleElement = doc.GetElementById("title");
titleElement.SetAttribute("value","check1");

尝试一下,看看是否找到了title元素,因为它失败的最可能原因是:没有名称为“title”的元素。

我喜欢在Web自动化中使用ScrapySharp框架(您可以在NuGet上找到它)。

var titleNodes = doc.DocumentNode.CssSelect("div#title").ToList();
foreach(var titleNode in titleNodes)
{
   titleNode.SetAttribute("value","check1");
}

顺便说一句。为什么你会这样做,改变这个属性?好奇......