2012-06-20 4 views
0

Я хочу, чтобы иметь возможность автоматизировать это, чтобы я мог перейти на одну страницу, загрузить, сделать код, следующую страницу, загрузить, сделать код. Сейчас я использую таймеры, но это не так эффективно, как ждать загрузки страницы. Вот то, что я думал, будет работать, но он просто переходит на последний сайт, а затем загружается.Как перейти на страницу, загрузить, перейти на страницу, загрузить и т. Д.

Мой подход, вероятно, неправильный, поэтому я надеялся, что кто-то может указать мне в правильном направлении.

спасибо.

private void button1_Click(object sender, EventArgs e) 
{ 
    string url1 = "http://google.com"; 
    string url2 = "http://yahoo.com"; 
    string url3 = "http://msn.com"; 

    webBrowser1.Navigate(url1); 
    webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); 
    webBrowser1.Navigate(url2); 
    webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); 
    webBrowser1.Navigate(url3); 
    webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); 
} 

ответ

2

Если вам нужно ждать первой страницу, чтобы завершить до начала следующей страницы, вы должны приковать навигации последовательно не дожидаясь, пока DocumentCompleted пожаров событий за предыдущий URL:

private void button1_Click(object sender, EventArgs e) 
{ 
    webBrowser1.DocumentCompleted += OnGoogleCompleted; 

    webBrowser1.Navigate("http://google.com"); 
} 

private void OnGoogleCompleted(object sender, EventArgs e) 
{ 
    webBrowser1.DocumentCompleted -= OnGoogleCompleted; 
    webBrowser1.DocumentCompleted += OnYahooCompleted; 

    webBrowser1.Navigate("http://yahoo.com"); 
} 

private void OnYahooCompleted(object sender, EventArgs e) 
{ 
    webBrowser1.DocumentCompleted -= OnYahooCompleted; 
    webBrowser1.DocumentCompleted += OnMsnCompleted; 

    webBrowser1.Navigate("http://msn.com"); 
} 

private void OnMsnCompleted(object sender, EventArgs e) 
{ 
    // ... 
} 
+2

Как будет эта шкала? Скажем, есть 5 или 10 или 20 URL. – bic

+0

Это работает отлично, только то, что мне нужно. Спасибо! – user1455112

+1

@bic: Он однопоточный, поэтому чем больше URL-адресов, тем больше времени потребуется. Таким образом, ОП указала это, поэтому я должен предположить, что это правильно для сценария. –

3

You не нужны разные обработчики событий для каждого события загрузки страницы. Просто создайте Stack/Queue для хранения страниц, которые вы хотите загрузить:

Queue<string> pagesToLoad = new Queue<string>(); 

private void Button1_Click(object sender, EventArgs e) 
{ 
    pagesToLoad.Enqueue("http://www.test.com"); 
    pagesToLoad.Enqueue("http://www.test2.com"); 
    pagesToLoad.Enqueue("http://www.test3.com"); 

    webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted; 
    webBrowser1.Navigate("http://www.first.com"); 
} 

Затем написать свой метод обработчика событий. Когда ваш браузер завершит загрузку страницы, он вызовет этот метод. Вы можете запустить свой код внутри него, и когда вы будете готовы, вы можете перейти к следующей странице.

webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    // TODO: do whatever you want with the page you just loaded 
    // You can get the page URL with e.Url 

    // Get the next Url from the queue and navigate: 
    if (pagesToLoad.Count == 0) 
    { 
     return; // Finished! 
    } 
    else 
    { 
     string nextUrl = pagesToLoad.Dequeue(); 
     webBrowser1.Navigate(nextUrl); 
    } 
}  

Всё.

+0

Это хорошая общая версия моего ответа. Я только решил пойти с конкретными обработчиками, чтобы проиллюстрировать рабочий процесс. –

+0

Очень хорошее решение! –

Смежные вопросы