Как нажать на несколько ссылок на нескольких страницах в webBrowser - PullRequest
0 голосов
/ 12 сентября 2011

Iam Невозможно сделать это с прошлой недели. Я хочу нажать на несколько ссылок на нескольких веб-страницах, используя webBrowser в C # Ниже приведен код, пожалуйста, помогите мне в этом отношении.

public void DoDelete()
{
    int count = 0;

    if (corruptList.Count > 0)
    {
        foreach (string listItem in corruptList)
        {
            var th = new Thread(() =>
            {
                try
                {
                    WebBrowser webBrowser = new WebBrowser();
                    webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBroswer_DocumentCompleted);
                    webBrowser.Navigate(listItem);
                    Thread.Sleep(100);
                    webBrowser.Dispose();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                this.Invoke(new MethodInvoker(delegate
                {
                    dataGridView_CorruptLinks.Rows[count].Cells[2].Value = "Deleted";
                }));
            });
            th.SetApartmentState(ApartmentState.STA);
            th.Start();
            Thread.Sleep(100);
        }
        count++;
    }
}


void webBroswer_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    try
    {
        WebBrowser webBrowser = sender as WebBrowser;
        HtmlElementCollection ec = webBrowser.Document.GetElementsByTagName("a");
        foreach (HtmlElement item in ec)
        {
            if (item.InnerHtml == "Delete this invalid field")
            {
                item.InvokeMember("Click");
                break;
            }
        }
    }
    catch (Exception exp)
    {
    }
}

Ответы [ 3 ]

0 голосов
/ 12 сентября 2011

Навигация - это асинхронное действие, и вы даете ему всего 1/10 секунды для завершения, прежде чем вызывать Dispose для объекта веб-браузера. Навигация и клики, вероятно, занимают больше времени, чем это, и поэтому нет веб-браузера, чтобы действовать против ... Вы также «проглатываете» все исключения в обработчике полного документа. Это очень плохая вещь. По крайней мере, вы должны вести там отладочную запись, чтобы помочь себе диагностировать проблему.

Но, чтобы сохранить подобную логику, вы должны создать коллекцию веб-браузеров на уровне класса. Что-то вроде:

private List<WebBrowser> _myWebBrowsers;

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

Это должно приблизить вас, хотя есть несколько других потенциальных проблем с вашим кодом. Вы выделяете borser-объект и поток для каждого цикла. Это может быстро стать громоздким. Вы должны использовать механизм управления потоками для регулирования этого процесса.

Упрощенный класс:

class WebRunner
{
    private List<string> _corruptList = new List<string>();
    private List<WebBrowser> _browsers = new List<WebBrowser>();

    public void Run()
    {
        _corruptList.Add("http://google.com");
        _corruptList.Add("http://yahoo.com");
        _corruptList.Add("http://bing.com");

        DoDelete();

        Console.ReadKey();
    }

    public void DoDelete()
    {
        if (_corruptList.Count < 1) return;

        int counter = 1;

        foreach (string listItem in _corruptList)
        {
            WebBrowser webBrowser = new WebBrowser();
            _browsers.Add(webBrowser);
            webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBroswer_DocumentCompleted);
            webBrowser.Navigated += new WebBrowserNavigatedEventHandler(webBrowser_Navigated);
            webBrowser.Navigate(listItem);
            if (counter % 10 == 0) Thread.Sleep(3000); // let app catch up every so often
            counter++;
        }
    }

    void webBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
    {
        Console.WriteLine("NAVIGATED: " + e.Url);
    }

    void webBroswer_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        Console.WriteLine("COMPLETED!");
        try
        {
            WebBrowser webBrowser = sender as WebBrowser;

            HtmlDocument doc = webBrowser.Document;
            var button = doc.Body.Document.GetElementById("button");
            button.InvokeMember("Click");

            _browsers.Remove(webBrowser);
        }
        catch (Exception exp)
        {
            Console.WriteLine(exp.StackTrace);
            MessageBox.Show(exp.Message);
        }
    }
}
0 голосов
/ 16 сентября 2011

Я нашел решение на следующий день. Извините за позднюю публикацию, обрабатывая потоки один за другим, помещая оператор после thread.sleep () if (th.ThreadState == ThreadState.Aborted || th.ThreadState == ThreadState.Stopped)

0 голосов
/ 12 сентября 2011

Вы можете получить доступ к содержимому документа WebBrowser, используя следующую информацию (у вас отсутствует тело, и вам нужно набрать документ в динамический).

dynamic doc = browser.Document;
var button = doc.body.document.getElementById("button");
button.Click();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...