2008-09-18 52 views
7

Tôi đang cố gắng tìm ra cách bấm vào một nút trên trang web theo lập trình.Làm thế nào để bấm vào một nút trên một trang web ASP.NET lập trình?

Cụ thể, tôi có một WinForm với một điều khiển WebBrowser. Một khi nó điều hướng đến trang ASP.NET đăng nhập mục tiêu tôi đang cố gắng để làm việc với, trong xử lý sự kiện DocumentCompleted Tôi đã sau đây mã:

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

này lấp đầy userid và văn bản mật khẩu hộp tốt, nhưng tôi không có bất kỳ thành công nào để nhận được nút nhấn để nhấp; Tôi cũng đã thử "click", "Click", và "onClick" - còn gì nữa ?. Một tìm kiếm của msdn tất nhiên cho tôi không có manh mối, cũng không phải groups.google.com. Tôi phải ở gần. Hoặc có thể không - ai đó nói với tôi rằng tôi nên gọi phương thức POST của trang, nhưng làm thế nào điều này được thực hiện không phải là một phần của lời khuyên đưa ra.

BTW Nút được mã hóa:

<input type="submit" name="logonButton" value="Login" onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="logonButton" tabindex="4" /> 
+0

[Đây là một tài liệu tham khảo tốt] (http://www.webtropy.com/articles/InternetExplorer.asp?Internet%20explorer) để sử dụng điều khiển WebBrowser (.NET 2.0) để tương tác với các phần tử biểu mẫu khác nhau. –

Trả lời

8

Tính năng này hoạt động như thế nào? Làm việc cho tôi

HtmlDocument doc = webBrowser1.Document; 

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

Bạn có thể thử và gọi phương thức Page_ClientValidate() trực tiếp qua clientscript thay vì nhấn nút, hãy để tôi đào lên một ví dụ.

Sử dụng MSHTML

mshtml.IHTMLWindow2 myBroserWindow = (mshtml.IHTMLWindow2)MyWebBrowser.Document.Window.DomWindow; 
myBroserWindow.execScript("Page_ClientValidate();", "javascript"); 
+0

Điều này có thể là vấn đề nếu trang đăng nhập đặc biệt tìm kiếm nhấp chuột vào nút –

+0

Rất đúng, tôi đã nghĩ về điều đó nhưng đã quyết định tôi sẽ ném phương thức gọi ra. –

6

var btn = document.getElementById (btnName); nếu (btn) btn.click();

+0

Thật tuyệt vời nếu đó là kịch bản khách hàng tôi cần, nhưng những gì tôi đang cố gắng làm là phía máy chủ. – Cyberherbalist

1

Bạn đã thử fireEvent thay vì RaiseEvent chưa?

1

Bạn có thể gọi phương thức trực tiếp và chuyển vào đối tượng chung và tham số EventArgs. Tất nhiên, điều này có thể không hoạt động nếu bạn đang xem thông số người gửi và EventArgs cho dữ liệu cụ thể. Làm thế nào tôi thường xử lý này là để tái cấu trúc ruột của phương thức thành phương thức doSomeAction() và trình xử lý sự kiện cho nút bấm sẽ đơn giản gọi hàm này. Bằng cách đó, tôi không phải tìm ra cách gọi những gì thường chỉ là một trình xử lý sự kiện để thực hiện một số logic trên trang/biểu mẫu.

Trong trường hợp javascript nhấp vào nút cho bài đăng biểu mẫu, bạn có thể gọi form.submit() trong tập lệnh phía máy khách - sẽ chạy bất kỳ tập lệnh xác thực nào bạn đã xác định trong thẻ - và sau đó phân tích Form_Load sự kiện và lấy giá trị văn bản của nút gửi trên biểu mẫu đó (giả sử chỉ có một) - ít nhất đó là cách ASP.NET 1.1 mà tôi rất quen thuộc ... bất cứ ai biết điều gì đó thanh lịch hơn với 2.0+ ?

0

Bạn đã đăng nhận xét dọc theo các dòng không muốn sử dụng tập lệnh phía máy khách trên câu trả lời của @ Phunchak. Tôi nghĩ rằng những gì bạn đang cố gắng làm là không thể. Cách duy nhất để tương tác với biểu mẫu là thông qua một kịch bản phía máy khách. Mã C# chỉ có thể kiểm soát những gì xảy ra trước khi trang được gửi ra trình duyệt.

0

thử này button.focus System.Windows.Forms.SendKeys.Send ("{ENTER}")

1

Chỉ cần một thể hữu ích thêm mà nút gửi đã không được đưa ra một Id - như thường lệ.

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

Vì vậy, bạn có thể gọi nó như vậy:

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

Nó sẽ nâng cao một ngoại lệ nếu nộp đầu vào với giá trị 'Đăng nhập', nhưng bạn có thể phá vỡ nó lên nếu bạn muốn có điều kiện kiểm tra trước khi gọi nhấp chuột.

+1

Tôi cảm thấy hơi nghịch ngợm và bị cắt xén để chấp nhận tài liệu điều khiển sao cho nó là một chức năng chung. – MonsCamus

Các vấn đề liên quan