Cum de a face un clic pe un buton de pe pagina web ASP.NET programabil?

Încerc să-mi dau seama cum să dai clic pe un buton pe o pagină web programat.

Mai exact, am un WinForm cu un control WebBrowser. Odată ce navighează la pagina de autentificare ASP.NET cu care încerc să lucrez, în manualul de evenimente DocumentCompleted am următoarele codificări:

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");

Acest lucru umple casetele de utilizator și parola de text bine, dar eu nu am nici un succes de a obține acel darned buton pentru a da clic; Am încercat, de asemenea, "clic", "faceți clic pe" și "onClick" - ce altceva există ?. O căutare de msdn desigur nu-mi dă niciun indiciu, nici grups.google.com. Trebuie să fiu aproape. Sau poate nu - cineva mi-a spus că ar trebui să numesc metoda POST a paginii, dar cum s-a făcut acest lucru nu face parte din sfatul dat.

BTW Butonul este codificat:

<input type="submit" name="logonButton" value="Login" onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="logonButton" tabindex="4" />
0
Iată o referință bună pentru utilizarea controlului WebBrowser (.NET 2.0) pentru a interacționa cu elemente de formă diferite.
adăugat autor Adam Neal, sursa

8 răspunsuri

Ați încercat FireEvent în loc de RaiseEvent?

0
adăugat

Ați postat un comentariu în paralel cu faptul că nu doriți să utilizați un script de client pe răspunsul lui @ Phunchak. Cred că ceea ce încerci să faci este imposibil. Singura modalitate de a interacționa cu formularul este prin intermediul unui script de client. Codul C# poate controla doar ceea ce se întâmplă înainte ca pagina să fie trimisă browserului.

0
adăugat

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

0
adăugat

var btn = document.getElementById (btnName); dacă (btn) btn.click ();

0
adăugat
Asta e minunat dacă ar fi script-ul de client de care aveam nevoie, dar ceea ce încerc să fac este serverul.
adăugat autor Cyberherbalist, sursa

Puteți încerca să invocați metoda Page_ClientValidate() direct prin clientcript în loc să faceți clic pe buton, permiteți-mi să fac un exemplu.

Utilizarea MSHTML

mshtml.IHTMLWindow2 myBroserWindow = (mshtml.IHTMLWindow2)MyWebBrowser.Document.Window.DomWindow;
myBroserWindow.execScript("Page_ClientValidate();", "javascript");
0
adăugat
Aceasta ar putea fi o problemă dacă pagina de conectare caută în mod specific clicul butonului
adăugat autor Jeff Martin, sursa
Foarte adevarat, m-am gandit la asta, dar am hotarat sa renunt la metoda invoke oricum.
adăugat autor Quintin Robinson, sursa

S-ar putea să apelați metoda direct și să treceți în parametrii generic obiect și EventArgs. Desigur, s-ar putea să nu funcționeze dacă v-ați uitat la parametrii expeditorului și EventArgs pentru date specifice. Modul în care mă ocup de obicei este de a refactoriza curajul metodei într-o metodă doSomeAction() și procedura de tratare a evenimentului pentru clic pe buton va numi pur și simplu această funcție. În acest fel nu trebuie să-mi dau seama cum să invocăm ceea ce este, de obicei, doar un manipulator de evenimente pentru a face un pic de logică pe pagină/formular.

În cazul javascriptului, făcând clic pe un buton pentru un post de formular, puteți invoca form.submit() în scriptul de client - care va rula orice script-uri de validare pe care le-ați definit în etichetă - și apoi analizați evenimentul Form_Load și apucați valoarea text a butonului de trimitere pe acel formular (presupunând că există doar unul) - cel puțin asta este modul ASP.NET 1.1 cu care sunt foarte familiar ... cineva știe de ceva mai elegant cu 2.0+?

0
adăugat

Cum funcţionează asta? Merge pentru mine

HtmlDocument doc = webBrowser1.Document;

doc.All["userIDTextBox"].SetAttribute("Value", "user1");
doc.All["userPasswordTextBox"].SetAttribute("Value", "Password!");
doc.All["logonButton"].InvokeMember("Click");
0
adăugat

Doar o posibilă utilitate extra în cazul în care butonul de trimitere nu a primit un Id - așa cum se întâmplă frecvent.

    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;
    }

Deci, puteți spune așa:

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

Se va ridica o excepție dacă trimiteți o intrare cu valoarea "Conectare", dar o puteți rupe dacă doriți să verificați în mod condiționat înainte de a invoca clicul.

0
adăugat
M-am simțit ușor și obraznic, pentru a accepta documentul de control, astfel încât să fie o funcție generică.
adăugat autor MonsCamus, sursa