5 / 5 / 3
Регистрация: 12.10.2009
Сообщений: 14

Как дождаться завершения IHtmlElement::Click() C#

12.10.2009, 19:39. Показов 3073. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Появилась следующая проблемка:
Загружаю в WebBrowser страничку, заполняю в ней поля логина и пароля, нажимаю логин с помощью метода Click() класса IHtmlElement. Все отлично нажимается и работает,логин с паролем вводится,кнопка нажимается, но...мне нужно чтобы сразу после того как кликнется кнопка и загрузится страничка,с ней дальше работать и получать с нее данные. Но как узнать,что страничка загрузилась? Пробовал ставить флаги на события WebBrowser.OnNavigated и WebBrowser.OnDocumentComplete, которые означают соответственно что загрузка идет и что загрузка завершилась.В начале каждой функции,которая работает со страничкой,делаю проверку флага,если он false, то делаю Application.DoEvents() и проверяю флаг заново. Но почему-то после вызова Click() не происходит этих событий:-(Получается так что если сразу после нажатия на кнопку мне нужно дальше что-то делать,то я работаю со старой страницей,незалогиневшись:-(
Вот вопрос собственно в том,как узнать когда завершиться Click()?

PS: пишу в Microsoft Visual Studio 2008, C#.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.10.2009, 19:39
Ответы с готовыми решениями:

Как красиво дождаться завершения процесса? IntPrt имеется.
polling устраивать не хочется. на с++ это выглядело примитивно просто: WaitForSingleObject (hProcess, INFINITE); // делай что нужно...

Дождаться завершения функции в потоке
Здравствуйте! Есть некоторый метод, в котором начинается работа в потоке. Когда поток завершает работу, вызывается событие OK(); ...

Дождаться завершения потока и выполнить действия
Вот к примеру псевдокод: button1_click() { t = new Thread(calculate()); t.Start() ... //дождаться завершения треда

2
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
13.10.2009, 04:45
Покажите код программы и код страницы с кнопкой
0
5 / 5 / 3
Регистрация: 12.10.2009
Сообщений: 14
13.10.2009, 08:31  [ТС]
Лучший ответ Сообщение было отмечено gadzilkin как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
 
        private static WebBrowser Browser = null;
        private bool isDocComplete = false;
        const String HomeURL = "https://www.partybets.com/home.ap?l=EN";
        public PartyBets(WebBrowser tmpBrowser)
        {
            Browser = tmpBrowser;
            Browser.Navigate(HomeURL);
            Browser.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(Browser_DocumentCompleted);
            Browser.Navigated += new System.Windows.Forms.WebBrowserNavigatedEventHandler(Browser_Navigated);            
            
        }
        private void Browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            isDocComplete = true;
        }
        private void Browser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            isDocComplete = false;
        }
        public void Login(string login, string password)
        {
            if (login != "" && password != "")
            {
                while (!isDocComplete)
                {
                    Application.DoEvents();
                }
                bool isLogin = false;
                bool isPassword = false;
                bool isSubmit = false;
                HtmlElementCollection pCol = null;
                mshtml.IHTMLElement iElem = null;
                pCol = Browser.Document.GetElementsByTagName("INPUT");
                if (pCol != null)
                {
                    for (int i = 0; i < pCol.Count; i++)
                    {
                        iElem = (mshtml.IHTMLElement)pCol[i].DomElement;
                        if (iElem != null && !isLogin && iElem.id == "ssoUser")
                        {
                            iElem.innerText = login;
                            isLogin = true;
                            iElem = null;
                        }
                        else
                        {
                            if (iElem != null && !isPassword && iElem.id == "ssoPass")
                            {
                                iElem.innerText = password;
                                isPassword = true;
                                iElem = null;
                            }
                            else
                            {
                                if (iElem != null && !isSubmit && iElem.id == "loginSubmit")
                                {
                                    iElem.click();
                                    isSubmit = true;
                                    isDocComplete = false;
                                    break;
                                }
                            }
                        }
                    }
                }
                pCol = null;
            }
        }
        public string Balance()
        {
            string s = "";
            if (Browser != null)
            {
                while (!isDocComplete)
                {
                    Application.DoEvents();
                }
                HtmlElementCollection pCol = null;
                mshtml.IHTMLElement iElem = null;
                pCol = (HtmlElementCollection)Browser.Document.GetElementsByTagName("DIV");
                if (pCol != null)
                {
                    for (int i = 0; i < pCol.Count; i++)
                    {
                        iElem = (mshtml.IHTMLElement)pCol[i].DomElement;
                        if (iElem.id == "blnc")
                        {
                            s = iElem.innerText;
                        }
                        if (iElem.id == "login")
                        {
                            s = "ErrorLogin";
                        }
                    }
                }
            }
            return s;
--------------------------------------------------------------------------------------------------------
//вызываю вот так
 
            PartyBets tmp = new PartyBets(webBrowser1);
            tmp.Login("...","...");
            MessageBox.Show(tmp.Balance());
Кусок кода страницы с кнопкой ЛОГИН

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<table height="24" border="0" cellpadding="0" cellspacing="0" class="formRow" width="100%">
                <tr>
                    <td width="100%" style="padding-right:5px;" align="right">Вход</td>
                    <td style="padding-right:10px;">
                        <input type="text" id="ssoUser" name="ssoUser" value=Имя потребителя
                            onfocus="clearInput(this, 'Имя потребителя');" 
              onblur="fillInput(this, 'Имя потребителя');" 
                            tabindex=1 
              class="inputBox" />
                    </td>
                    <td width="10"> </td>
                    <td><input type=password id="ssoPass" name="ssoPass" value=******** 
                 onfocus="clearInput(this, '********' );" 
                 onblur="fillInput(this, '********');" 
                 tabindex=2 
                 class="inputBox" 
                                 maxlength="26" /></td>
                    <td style="padding-right: 10px;">
            <input type="image" id="loginSubmit" onClick="doLogin('https://www.partybets.com/loginSubmit.ap?l=RU'); return false;" tabindex=3 src="https://secure.footprint.net/partybets/b/stand_alone/images/go_button.gif" alt="Вход" name="loginSubmit" border="0" class="inputButton" title="Вход" disabled />
          </td>
                </tr>
</table>
Вот с таким кодом он зацикливался когда вызывал Balance() и пытался дождаться когда isDocComplete станет true.....вчера попробовал у обработчиков событий убрать private,логинится стал,даже отображает в окне страничку,но после того как ее показывает,то дальше ни один оператор не выполняется:-(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.10.2009, 08:31
Помогаю со студенческими работами здесь

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

Как правильно дождаться завершения потока?
Здравствуйте у меня возник вопрос как дождаться завершения потока метод Thread.join(); тормозит форму да и всу программу А мне нужно чтоб...

Запустить внешнюю программу и дождаться ее завершения
Доброго времени суток. Я новичек в программировании и тем более в C#. Очень нужна помощь. Форма с кнопками, textbox, chekedlistbox....

Как дождаться завершения RequestTask?
при создании активити в new RequestTask().execute делаю веб запрос, по результатам которого достраивается интерфейс... т.к. в потоке его...

Как дождаться завершения потока?
void Thread(void* pParam); void main(){ _beginthread(Thread, 0, NULL);//Запускаем поток, он выполняет свои задачи.... //Тут...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений Всем привет. А вот мой компьютер, переделанный из ноутбука. Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца: Хочу еще Симбу взять, очень нравится. . .
Инференс ML моделей в Java: TensorFlow, DL4J и DJL
Javaican 05.11.2025
Python захватил мир машинного обучения - это факт. Но когда дело доходит до продакшена, ситуация не так однозначна. Помню проект в крупном банке три года назад: команда data science натренировала. . .
Mapped types (отображённые типы) в TypeScript
Reangularity 03.11.2025
Mapped types работают как конвейер - берут существующую структуру и производят новую по заданным правилам. Меняют модификаторы свойств, трансформируют значения, фильтруют ключи. Один раз описал. . .
Адаптивная случайность в Unity: динамические вероятности для улучшения игрового дизайна
GameUnited 02.11.2025
Мой знакомый геймдизайнер потерял двадцать процентов активной аудитории за неделю. А виновником оказался обычный генератор псевдослучайных чисел. Казалось бы - добавил в карточную игру случайное. . .
Протоколы в Python
py-thonny 31.10.2025
Традиционная утиная типизация работает просто: попробовал вызвать метод, получилось - отлично, не получилось - упал с ошибкой в рантайме. Протоколы добавляют сюда проверку на этапе статического. . .
C++26: Read-copy-update (RCU)
bytestream 30.10.2025
Прошло почти двадцать лет с тех пор, как производители процессоров отказались от гонки мегагерц и перешли на многоядерность. И знаете что? Мы до сих пор спотыкаемся о те же грабли. Каждый раз, когда. . .
Изображения webp на старых x32 ОС Windows XP и Windows 7
Argus19 30.10.2025
Изображения webp на старых x32 ОС Windows XP и Windows 7 Чтобы решить задачу, использовал интернет: поисковики Google и Yandex, а также подсказки Deep Seek. Как оказалось, чтобы создать. . .
Passkey в ASP.NET Core identity
stackOverflow 29.10.2025
Пароли мертвы. Нет, серьезно - я повторяю это уже лет пять, но теперь впервые за это время чувствую, что это не просто красивые слова. В . NET 10 команда Microsoft внедрила поддержку Passkey прямо в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru