Arslan Amjad Gondal
Arslan Amjad Gondal

Reputation: 23

Navigate URLs using WebBrowser DocumentCompleted

This is the scenario

1-Navigate to admin page.

2-Enter username and password

3-Navigate to new page

4-Fill some text in textareas etc and post .

5-Repeat Step 3 and 4 until loop ends

The Code Below successfully does step 1 and 2. But it reaches step 3 before new page is loaded and generates the error "Object reference not set to an instance of an object" on this line doc.GetElementById("title").SetAttribute("value", "check1");

I am trying to achieve this from last 3 days but can't reached step 3 until now. Any help will be appreciated

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;
        }
    }

Upvotes: 0

Views: 2162

Answers (1)

skhro87
skhro87

Reputation: 143

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

Try that and see if the title element is found after all, since the most likely reason it fails is: There is no element with the name "title".

I like using ScrapySharp framework (you'll find it on NuGet) for web automation.

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

btw. why would you do that anyway, changing this attribute? Just curious...

Upvotes: 1

Related Questions