Как программно нажать кнопку на веб-странице ASP.NET?

Я пытаюсь понять, как программно нажать кнопку на веб-странице.

В частности, у меня есть WinForm с элементом управления WebBrowser. Когда он перейдет на целевую страницу входа в ASP.NET, с которой я пытаюсь работать, в обработчике событий DocumentCompleted у меня есть следующий код:

HtmlDocument doc = webBrowser1.Document;

HtmlElement userID = doc.GetElementById("userIDTextBox");
userID.InnerText = "user1";

HtmlElement password = doc.GetElementById("userPasswordTextBox");
password.InnerText = "password";

HtmlElement button = doc.GetElementById("logonButton");
button.RaiseEvent("onclick");

Это прекрасно заполняет текстовые поля userid и password, но я не добился успеха в том, что эта чертова кнопка нажала; Я также пробовал «кликнуть», «кликнуть» и «onClick» - что еще там ?. Поиск msdn, конечно, не дает мне никаких подсказок, а не group.google.com. Я должен быть рядом. Или, может быть, нет - кто-то сказал мне, что я должен называть метод POST страницы, но то, как это делается, не является частью приведенного совета.

BTW Кнопка закодирована:

<input type="submit" name="logonButton" value="Login" onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="logonButton" tabindex="4" />
0
добавлено
Просмотры: 24
Вот хорошая ссылка для использования элемента управления WebBrowser (.NET 2.0) для взаимодействия с различными элементами формы.
добавлено автор Adam Neal, источник

8 ответы

Вы пытались использовать fireEvent вместо RaiseEvent?

0
добавлено

Вы отправили комментарий по строкам, не желая использовать сценарий на стороне клиента, на ответ @ Phunchak. Я думаю, что вы пытаетесь сделать это невозможно. Единственный способ взаимодействия с формой - это сценарий на стороне клиента. Код C# может контролировать только то, что происходит до отправки страницы в браузер.

0
добавлено

There is an example of how to submit the form using InvokeMember here. http://msdn.microsoft.com/en-us/library/ms171716.aspx

0
добавлено

var btn = document.getElementById (btnName); if (btn) btn.click ();

0
добавлено
Это здорово, если это был клиентский сценарий, который мне нужен, но то, что я пытаюсь сделать, это серверная сторона.
добавлено автор Cyberherbalist, источник

Вы можете попробовать и вызвать метод Page_ClientValidate() непосредственно через clientcript вместо нажатия кнопки, позвольте мне выкопать пример.

Использование MSHTML

mshtml.IHTMLWindow2 myBroserWindow = (mshtml.IHTMLWindow2)MyWebBrowser.Document.Window.DomWindow;
myBroserWindow.execScript("Page_ClientValidate();", "javascript");
0
добавлено
Это может быть проблемой, если на странице входа в систему определенно отображается щелчок кнопки
добавлено автор Jeff Martin, источник
Очень верно, я подумал об этом, но решил, что все равно выкинет метод invoke.
добавлено автор Quintin Robinson, источник

Вы можете вызвать метод напрямую и передать параметры общего объекта и EventArgs. Конечно, это может не сработать, если вы просматриваете параметры отправителя и EventArgs для конкретных данных. Обычно я обрабатываю это, чтобы реорганизовать кишки метода методу doSomeAction (), и обработчик события для нажатия кнопки просто вызовет эту функцию. Таким образом, мне не нужно выяснять, как вызывать то, что обычно является обработчиком событий, чтобы сделать некоторую бит логики на странице/форме.

В случае javascript, нажимая кнопку для сообщения формы, вы можете вызвать form.submit() в скрипте на стороне клиента, который будет запускать любые скрипты проверки, определенные вами в теге, и затем проанализировать событие Form_Load и захватить текстовое значение кнопки отправки в этой форме (при условии, что есть только одна) - по крайней мере, это способ ASP.NET 1.1, с которым я очень хорошо знаком ... кто-нибудь знает что-то более элегантное с 2.0+?

0
добавлено

Как это работает? Работает на меня

HtmlDocument doc = webBrowser1.Document;

doc.All["userIDTextBox"].SetAttribute("Value", "user1");
doc.All["userPasswordTextBox"].SetAttribute("Value", "Password!");
doc.All["logonButton"].InvokeMember("Click");
0
добавлено

Только возможная полезная дополнительная опция, когда кнопке submit не был предоставлен идентификатор - как это часто бывает.

    private HtmlElement GetInputElement(string name, HtmlDocument doc) {
            HtmlElementCollection elems = doc.GetElementsByTagName("input");

            foreach (HtmlElement elem in elems)
            {
                String nameStr = elem.GetAttribute("value");
                if (!String.IsNullOrEmpty (nameStr) && nameStr.Equals (name))
                {
                    return elem;
                }
            }
            return null;
    }

Поэтому вы можете назвать это так:

 GetInputElement("Login", webBrowser1.Document).InvokeMember("Click");

Это приведет к возникновению исключения, если входной ввод будет иметь значение «Вход», но вы можете его разбить, если вы хотите условно проверить перед вызовом клика.

0
добавлено
Я чувствовал себя слегка озорным и снова склонился, чтобы принять контрольный документ, так что это общая функция.
добавлено автор MonsCamus, источник