Отправка формы веб-страницы с помощью элемента управления WebBrowser в C#

Я видел много сообщений по этому конкретному вопросу на SO, а также в интернете в целом, и большинство, если не весь код, как показано ниже

private void btnSubmit_Click(object sender, RoutedEventArgs e)
{
  webBrowser1.Navigate(new Uri("http://samples.msdn.microsoft.com/workshop/samples/author/dhtml/refs/onsubmit.htm"));
}

private void btnLogin_Click(object sender, RoutedEventArgs e)
{
    mshtml.HTMLDocument htmlDoc = null;

    htmlDoc = (mshtml.HTMLDocument) this.webBrowser1.Document;

    if (webBrowser1.Document != null)
    {
        foreach (mshtml.HTMLFormElement form in htmlDoc.forms)
        {
            form.submit();
            break;
        }
    }
}

код не имеет никаких ошибок, но для жизни его не подчиняется. Пример страницы, которую я использую, имеет простую кнопку, что она делает, она предупреждает выбор переключателя, а затем отправляет форму. По какой-то странной причине, когда форма передается через код с помощью элемента управления WebBrowser, форма отправлено, но предупреждение никогда не появляется.

Я не уверен, что я делаю неправильно здесь. Любая помощь будет оценили.

3 ответов


будет ли выполнение щелчка по кнопке делать то, что вам нужно? Вам нужно будет добавить ссылку COM в библиотеку объектов Microsoft HTML (которая у вас уже может быть). Например, если вы загрузите google в элемент управления webbrowser, этот код поместит "hello world" в поле поиска и выполнит поиск:

        mshtml.IHTMLDocument2 doc = ((mshtml.HTMLDocumentClass)webBrowser1.Document);


         ((mshtml.IHTMLElement)doc.all.item("q")).setAttribute("value", "hello world");
         MessageBox.Show("Clicking I'm feeling lucky button");
        ((mshtml.HTMLInputElement)doc.all.item("btnI")).click();

Edit: я обновил код для компонентов, которые использует элемент управления WPF WebBrowser. Также обратите внимание, что это иногда вызывает ошибку сценария из google, но это, похоже, проблема времени, основанная на некоторых вызовах ajax, которые google имеет на домашней странице.


чтобы исправить вашу проблему, вам нужно заменить строку:

form.submit();

со следующим кодом:

var children = form as IEnumerable;
var inputs = children.OfType<mshtml.HTMLInputElement>();
var submitButton = inputs.First(i => i.type == "submit");

submitButton.click();

Это покажет предупреждение о выборе пользователя и отправить форму.


У меня есть более грязная однострочная работа, вводя JavaScript для отправки формы

_webBrowser.InvokeScript("eval", new object[] { "document.getElementById('formName').submit()" });

это работает для меня при взаимодействии с сайтом, используя много JavaScript и кнопки за пределами формы.