none
Зацикливание в WebBrowser в событии wb_DocumentCompleted RRS feed

  • Вопрос

  • Есть программа которая заходит на сайт и нажимает кнопки.

    private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                if (wb.Document.GetElementById("login-email") != null)
                {
                    wb.Document.GetElementById("login-email").InnerText = settingsForm.tEmail.Text;
                    wb.Document.GetElementById("login-password").InnerText = settingsForm.tPassword.Text;
                    Method_1("button luxury")[0].InvokeMember("click");
                }
                if (settingsForm.Hunts())  //Проверяет если чекбокс выбран то выполнять действия
                {
                    callTimers.CallMethodAfterDelay(KrysomahHunting, 5000, tm); //метод перехода на другую страницу через 5 секунд
                    
                    if (wb.Url.AbsoluteUri == "http://www.moswar.ru/metro/") //Если это та странца то выполнять методы
                    {
                        var method2 = method_4("c", "Выследить Крысомаху");
                        
                        if (method2.Count > 0)
                        {
                            method2[0].InvokeMember("click");
                        }
                        var method3 = method_4("c" ,"Напасть на монстра" );
                        if(method3.Count > 0)
                            method3[0].InvokeMember("click");
                    }
                }
    Проблема в том что когда проверяет что чекбокс выбран и все последущие методы выполнеены ,
    событие wb_DocumentCompleted опять переходи к проверке -выбран ли чек бокс,и начинается выполнение методов сначала.
    Как этого исправить.Может условия нужно другие в if писать?Даже и не знаю что и делать!!!

    8 ноября 2012 г. 6:44

Ответы

  • Скорее всего на странице есть фреймы и они тоже грузятся вызывая событие. Проверяйте абсолютный путь главного окна, и если он не совпадает просто делайте возврат из метода:

    if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) return;

    • Помечено в качестве ответа Abolmasov Dmitry 21 ноября 2012 г. 14:30
    8 ноября 2012 г. 7:07
    Модератор
  • Дело в чем .У меня когда проверяет выбран ли чек бокс - он выбран срабатывает метод

    callTimers.CallMethodAfterDelay(KrysomahHunting, 5000, tm); //wb.Navigate("http://www.moswar.ru/metro/");

    И выполняюстя методы. После их выполнения , опять проверяет выбран ли чек бокс и все начинается заново.Мне бы как проверочку по логичнее

    написать , может переменную какую дополнительную вставить чтоб после выполнения ей присваивалось значение допустим false .И проверка

     if (settingsForm.Hunts()) 

    уже не работала.А как это правильно сформулировать в коде незнаю.

    • Помечено в качестве ответа Abolmasov Dmitry 21 ноября 2012 г. 14:30
    8 ноября 2012 г. 7:24

Все ответы

  • Скорее всего на странице есть фреймы и они тоже грузятся вызывая событие. Проверяйте абсолютный путь главного окна, и если он не совпадает просто делайте возврат из метода:

    if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) return;

    • Помечено в качестве ответа Abolmasov Dmitry 21 ноября 2012 г. 14:30
    8 ноября 2012 г. 7:07
    Модератор
  • Дело в чем .У меня когда проверяет выбран ли чек бокс - он выбран срабатывает метод

    callTimers.CallMethodAfterDelay(KrysomahHunting, 5000, tm); //wb.Navigate("http://www.moswar.ru/metro/");

    И выполняюстя методы. После их выполнения , опять проверяет выбран ли чек бокс и все начинается заново.Мне бы как проверочку по логичнее

    написать , может переменную какую дополнительную вставить чтоб после выполнения ей присваивалось значение допустим false .И проверка

     if (settingsForm.Hunts()) 

    уже не работала.А как это правильно сформулировать в коде незнаю.

    • Помечено в качестве ответа Abolmasov Dmitry 21 ноября 2012 г. 14:30
    8 ноября 2012 г. 7:24
  • Как будет грамотно написать проверку чекбокса - когда он выбран.

     if (settingsForm.Hunts.checked)  //Проверяет если чекбокс выбран то выполнять действия
                {
                    callTimers.CallMethodAfterDelay(KrysomahHunting, 5000, tm); //метод перехода на другую страницу через 5 секунд
                    
                    if (wb.Url.AbsoluteUri == "http://www.moswar.ru/metro/") //Если это та странца то выполнять методы
                    {
                        var method2 = method_4("c", "Выследить Крысомаху");
                        
                        if (method2.Count > 0)
                        {
                            method2[0].InvokeMember("click");
                        }
                        var method3 = method_4("c" ,"Напасть на монстра" );
                        if(method3.Count > 0)
                            method3[0].InvokeMember("click");
                    }
    Что бы постоянно не проверял установлен ли чек бокс , а только 1 раз.

    8 ноября 2012 г. 8:55
  • "Что бы постоянно не проверял установлен ли чек бокс , а только 1 раз." - а что за чекбокс, на странице? Пока не совсем понятно, что Вы хотите?
    12 ноября 2012 г. 19:11
    Модератор
  • У меня не страница ,а windows form приложение.Я хочу - если у меня выбран чек бокс .То в событии
    wb_DocumentCompleted
    выполнять следующие методы.Это все получилось , только проблема в том что , если выбран чек бокс , то срабатывает функция перехода на другую страницу и идет выполнение методов.Но как только отработает метод перехода на страницу и выполнение следующих 2 методов.То событие
    wb_DocumentCompleted
    Проверяет установлен ли чек бокс (он естественно выбран) и начинается выполнение методов заново.Вверху в коде я даже прокомментировал строки.
    13 ноября 2012 г. 2:56
  • А Вы снимите пометку с чекбокса программно, после первой проверки.
    13 ноября 2012 г. 5:52
    Модератор
  • А как бы вы это сами реализовали?

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

    Далее по истечении времени (1-2 мин не имеет значения) , опять заполняем поле и нажимаем искать.

    Если использовать timer_Tick , то примерно в таком ввиде :

    private void tm_Tick(object sender, EventArgs e) //Обработчик события Tick
            {
                ((MethodInvoker)tm.Tag).Invoke();
                tm.Stop();
            }
    public void CallMethodAfterDelay(MethodInvoker MethodToCall, int Delay,Timer tm) //Метод который вызывает timer_Tick
           {
               tm.Interval = Delay;
               tm.Tag = MethodToCall;
               tm.Start();
           }
    А так на ваше усмотрение.Используйте к примеру yandex или google.Вообщем не важно , главное смысл кода.


    14 ноября 2012 г. 2:57
  • Введите дополнительную переменную, как вы сами и предложили, которая будет указывать вам нужно ли вообще запускать часть с проверкой чекбокса или нет.

    Если после проверки чекбокса и до адреса страниц различаются, то можно определять по ним.


    Для связи [mail]

    21 ноября 2012 г. 14:29