Элемент управления WebBrowser получает ошибку Javascript при моделировании нажатия кнопки или ввода... Работает при нажатии или нажатии Enter
Я пытаюсь автоматизировать вход на конкретный сайт. Это похоже на типичную форму с двумя текстовыми вводами (имя пользователя, пароль) и кнопкой типа "отправить". У всех трех есть идентификаторы, поэтому я могу легко вызвать GetElementById для каждого.
Мой код выглядит примерно так:
webBrowser1.Document.GetElementById("username").SetAttribute("Value", "myUser");
webBrowser1.Document.GetElementById("password").SetAttribute("Value", "myPass");
webBrowser1.Document.GetElementById("submitButton").InvokeMember("Click");
Это (Сорта) работает. Значения устанавливаются, и форма отправляет / отправляет запрос на сервер. Но я сразу получаю ошибку JavaScript. Если я удаляю строку "Клик" и позволяю моей программе загрузить страницу / заполняю имя пользователя / пароль, и я вручную нажимаю на кнопку - все работает на 100%.
Хорошо, я подумал.... Мне не нужно нажимать. Я могу просто использовать клавиатуру! Три вкладки, за которыми следует ввод, успешно входят в систему. Поэтому я попытался использовать SendKeys.Send()
Thread.Sleep(250);
SendKeys.Send("{TAB}");
Thread.Sleep(250);
SendKeys.Send("{TAB}");
Thread.Sleep(250);
SendKeys.Send("{TAB}");
Thread.Sleep(250);
SendKeys.Send("{ENTER}");
Первоначально это была одна строка, я ввел задержки во время отладки, но безрезультатно. Приведенный выше код дает тот же результат, что и при автоматическом нажатии - ошибка JavaScript, и следующая страница не загружается.
Но если я нажимаю вкладку, вкладка, вкладка, ввод - это работает.
Я пошел еще дальше, если сохранить код SendKeys.Send("{TAB}"), моя программа автоматизации заполнит имя пользователя / пароль и успешно перейдет к кнопке отправки. Если я нажимаю ввод на клавиатуре, нет ошибки JavaScript и все отлично. Но если я использую SendKeys.Send("{ENTER}") - ничего не работает.
У меня сложилось впечатление, что SendKeys.Send сгенерировал "настоящее" нажатие клавиш в отношении ОС Windows?
Может кто-нибудь сказать мне, что происходит и как я могу получить этот логин для работы с элементом управления WebBrowser?
1 ответ
Трудно догадаться, но попробуйте так:
async Task SendSomeKeys()
{
await Task.Delay(250);
SendKeys.Send("{TAB}");
await Task.Delay(250);
SendKeys.Send("{TAB}");
await Task.Delay(250);
SendKeys.Send("{TAB}");
await Task.Delay(250);
SendKeys.Send("{ENTER}");
}
Разница в том, что вы будете отправлять ключи асинхронно таким образом, предоставляя браузеру возможность обрабатывать сообщения Windows между нажатиями клавиш (в отличие от Thread.Sleep
). Так что это было бы ближе к ручным действиям. Если это работает, тот же подход может работать для SetAttribute
/InvokeMember
,