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

Я видел много постов, касающихся этой конкретной темы, как в 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 ]

6 голосов
/ 10 февраля 2011

Будет ли выполнение щелчка по кнопке делать то, что вам нужно? Вам нужно будет добавить ссылку на COM в библиотеку объектов Microsoft HTML (которая у вас уже может быть). Например, если вы загрузите Google в элемент управления веб-браузера, этот код поместит «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();

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

4 голосов
/ 14 февраля 2011

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

form.submit();

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

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

submitButton.click();

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

1 голос
/ 19 августа 2015

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

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

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

...