Элемент управления 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,

Другие вопросы по тегам