2011-02-04 21 views
6

Tôi đã thấy rất nhiều bài viết về vấn đề cụ thể này trên SO cũng như trên web nói chung và hầu hết nếu không phải tất cả các mã được như bên dướiNộp một hình thức trang web bằng điều khiển WebBrowser trong C#

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

Mã không có lỗi gì ngoài cuộc sống mà nó không gửi. Trang mẫu mà tôi đang sử dụng có nút đơn giản, nó hoạt động như thế nào, nó cảnh báo việc chọn nút radio và sau đó gửi biểu mẫu. Đối với một số lý do lạ khi biểu mẫu được gửi qua mã bằng cách sử dụng điều khiển WebBrowser, biểu mẫu được gửi nhưng cảnh báo không bao giờ hiển thị.

Tôi không chắc mình đang làm gì sai ở đây. Bất kỳ trợ giúp về điều này sẽ được đánh giá cao.

+0

Tôi có thể hỏi tại sao bạn đang cố thực hiện việc này? –

+0

Bạn đã lôi kéo sự kiện như thế nào và làm gì? –

+1

@Matti, tôi đang cố gắng tự động hóa quy trình đăng nhập trên mạng nội bộ không có tùy chọn nhớ tôi. – vikramjb

Trả lời

6

Thực hiện nhấp chuột vào nút có thực hiện những gì bạn cần để thực hiện không? Bạn sẽ cần thêm một tham chiếu COM vào Thư viện đối tượng HTML của Microsoft (mà bạn có thể đã có). Ví dụ, nếu bạn tải lên google vào sự kiểm soát WebBrowser, mã này sẽ đặt "hello world" vào hộp tìm kiếm và thực hiện tìm kiếm:

 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: Tôi cập nhật các mã cho các thành phần WebBrowser WPF kiểm soát sử dụng. Cũng lưu ý rằng điều này đôi khi ném một lỗi kịch bản từ google, nhưng đó dường như là một vấn đề thời gian dựa trên một số cuộc gọi ajax google có trên trang chủ.

+0

Phương pháp Tất cả dường như không có trong điều khiển webBrowser1. Tui bỏ lỡ điều gì vậy ? – vikramjb

+0

Thuộc tính .all là thành viên của thành viên .Document của lớp webbrowser. Nó đã có sẵn kể từ .net 2.0: http://msdn.microsoft.com/en-US/library/system.windows.forms.htmldocument.all(v=VS.80).aspx –

+0

Tôi đang sử dụng điều khiển webBrowser trong một dự án WPF và tôi không thấy phương thức đó ở bất cứ đâu. Bỏ qua thuộc tính tài liệu của điều khiển webBrowser có vẻ là kiểu dữ liệu đối tượng. – vikramjb

4

Để khắc phục vấn đề của bạn, bạn cần phải thay thế dòng:

form.submit(); 

Với đoạn mã sau:

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

submitButton.click(); 

này sẽ hiển thị cảnh báo về việc lựa chọn người dùng và nộp mẫu đơn.

+0

Nút gửi là hình ảnh gọi cho JS để gửi biểu mẫu đó là lý do tôi đã gửi form.submit. – vikramjb

+0

Bạn có thể tìm thấy một hình ảnh bên trong biểu mẫu (giống như cách tôi đã làm với nút gửi) và sau đó nhấp vào nó. Nó sẽ giúp bạn, trong trường hợp khi kịch bản mà bạn đề cập làm một cái gì đó nhiều hơn chỉ đơn giản là gửi mẫu đơn. –

+0

Oleg câu trả lời của bạn cũng đúng buts kể từ đó, tôi đã thử mẫu của john đầu tiên tôi đã cho tiền thưởng cho anh ta. – vikramjb

1

Tôi đã có một bẩn thêm một lớp lót làm việc bằng cách tiêm một hoạt Javascript để gửi biểu mẫu

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

Đó là được làm việc cho tôi khi tương tác với một trang web sử dụng rất nhiều JavaScript và nút ngoài dưới hình thức .

+0

Một dòng thực sự bẩn thỉu, nhưng đó là câu trả lời duy nhất trên trang này làm việc cho tôi. – colton7909