Ответ 1
Хорошо, если вы работали с разработчиками сайта для создания решения для своего приложения, вы использовали бы ObjectForScripting
для связи между JavaScript и приложением. Там хорошая статья здесь, и еще один вопрос, который может быть полезен здесь.
Однако, насколько я понимаю ваш вопрос, сайт является произвольным сторонним сайтом, не связанным с вашим приложением, и вы хотите автоматически заполнить некоторые значения формы и отправить форму в свой код.
Для этого вы можете обработать событие LoadCompleted
для WebBrowser. Это вызывается, когда загруженный документ readyState
изменяется на завершенный. Поэтому вы можете использовать это событие как крючок, чтобы затем установить/прочитать значения формы документа. Обратите внимание, что вам нужно будет добавить ссылку на Microsoft mshtml
в проекте.
Ниже приведена команда MVVM style (PRISM), которая позволяет событию напрямую связываться с ViewModel
с использованием поведения. Это эквивалентно регистрации обработчика события в коде.
public ICommand LoadCompleted
{
get
{
return new EventToCommandWithSender<NavigationEventArgs>(
(s,e) => {
WebBrowser browser = (WebBrowser) sender;
// false if nested frame
if (e.IsNavigationInitiator)
{
mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)browser.Document;
// always completed
var readyState = doc.readyState;
// populate form
var name = doc.body.document.getElementById("username");
name.value = "@TheCodeKing";
// submit form
var submit = doc.body.document.getElementById("submit");
submit.Click();
}
});
}
}
К сожалению, NavigationEventArgs
не предоставляет способ доступа к HTML-документу или запросам данных. Он содержит свойство WebRequest
, но это не было реализовано и всегда будет нулевым. В моем примере я принял пользовательский класс EventToCommandWithSender
, который отправляет отправителю, а также ARG-события в случае возникновения события, но до вашей собственной реализации, чтобы получить доступ к отправителю.