Завершенный веб-браузер не показывает все элементы - PullRequest
1 голос
/ 01 мая 2019

У меня есть веб-браузер, который загружает сайт.Если веб-сайт запускает «завершенное» событие, мой HTMLElementCollection показывает мне счет «179».Если я нажимаю на кнопку и вызываю один и тот же метод, чтобы получить все HTMLElements, он говорит мне счет «194».Проблема заключается в том, что если завершенное событие запускается, некоторые HTMLE-элементы не загружены и требуют более длительного времени, а мой HTMLElement, на который мне нужно нажать, тоже отсутствует.

Чтобы объяснить с помощьюкод:

private void Webbrowser_DocumentComplete(object pDisp, ref object URL)
        {
                if (URL.ToString() == "testsite")
                {
                    HtmlElementCollection c1 = webBrowser1.Document.GetElementsByTagName("div");
                    foreach (HtmlElement e2 in c1)
                    {
                        if (e2.GetAttribute("classname") == "btn3")
                        {
                            if (e2.InnerText == "follow")
                            {
                                e2.InvokeMember("click");
                            }
                        }
                    }
                }
        }

Количество «c1» равно 179.

Если я подожду 1-2 секунды и нажму на кнопку с таким же кодом, как:

private void Button1_Click(object sender, EventArgs e)
        {
HtmlElementCollection c1 = webBrowser1.Document.GetElementsByTagName("div");
                    foreach (HtmlElement e2 in c1)
                    {
                        if (e2.GetAttribute("classname") == "btn3")
                        {
                            if (e2.InnerText == "follow")
                            {
                                e2.InvokeMember("click");
                            }
                        }
                    }
        }

Количество "c1" равно 194.

Вопрос: как я могу подождать несколько секунд, если страница построена?Мне нужен счет 194, потому что есть ОДИН элемент HTMLEment, который я хочу щелкнуть по нему!

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Спасибо всем вам, но я снова зашел в Google и нашел очень хороший (для меня работающий) обходной путь. Для всех: я хочу, чтобы после перехода на страницу таймер (или что-то еще) ждал х-секунд, а во время ожидания таймера страница загружается, и после этого я хочу нажать на кнопку.

Прежде всего: код сделан не мной. Это из https://dotnet -snippets.de / snippet / webbrowser-navigate-and-wait-секунд / 15171

Сначала объявите это в начале:

  public delegate void NavigateDoneEvent();
        public static event NavigateDoneEvent Done;

        private static System.Windows.Forms.Timer wait;

Вам не нужно использовать это как статический.

После этого вам нужно создать эту функцию

 public static void Wait(WebBrowser Browser, string Url, double Seconds)
        {
            Browser.Navigate(Url);

            wait = new System.Windows.Forms.Timer();
            wait.Interval = Convert.ToInt32(Seconds * 1000);

            wait.Tick += (s, args) =>
            {
                if (Done != null) Done();
                wait.Enabled = false;
            };

            wait.Enabled = true;
        }

И вы можете вызвать эту функцию как:

Wait(webBrowser1, "somesite.com", 20);
            Done += afterWaitDoSomething;
0 голосов
/ 02 мая 2019

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

    public void WaitForSecond(int min)
    {
        System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
        if (min == 0 || min < 0) return;
        timer1.Interval = min * 1000;
        timer1.Enabled = true;
        timer1.Start();
        timer1.Tick += (s, e) =>
        {
            timer1.Enabled = false;
            timer1.Stop();

        };
        while (timer1.Enabled)
        {
            Application.DoEvents();
        }
    }

Кроме того, вы можете уменьшить свой код на LINQ

HtmlElement e2= (from HtmlElement element in 
                  webBrowser1.Document.GetElementsByTagName("div") 
                  select element)
                  .Where(x => x.GetAttribute("classname") != null 
                           && x.GetAttribute("classname") =="btn3"
                           && x.InnerText != null 
                           && x.InnerText == "follow").FirstOrDefault();

Во-первых, проверьте, загружен ли ваш HTML-элемент или нет. Если HTML-элемент загружен, обработайте дальнейшие шаги

HtmlElement e2= null;
int cnt = 0;
            do
            {
                WaitForSecond(1);
                cnt++;

                if (cnt > 60)
                {
                   MessageBox.Show("Web page not loaded");
                    break;
                }
                e2= (from HtmlElement element in webBrowser1.Document.GetElementsByTagName("div") select element)
                .Where(x => x.GetAttribute("classname") != null 
                       && x.GetAttribute("classname") =="btn3"
                       && x.InnerText != null 
                       && x.InnerText == "follow").FirstOrDefault();    
            } while e2 == null);
...