2010-09-21 50 views
15

Tôi đang sử dụng thành phần WATin IE để duyệt một trang web cụ thể Khi bắt đầu sự kiện bấm nút StartBrowsing Tôi đang khởi tạo đối tượng WatiN.Core.IE và truyền URL của trang web để mở trang web như trong đoạn mã dưới đây: -Thành phần WatiN.Core.IE cho Thời gian chờ trong khi Internet Explorer bị lỗi khi mở URL

WatiN.Core.IE ie; 

private void btnStartBrowsing_Click(object sender, EventArgs e) 
{   
    ie = new IE(URLs.mainURL); 
} 

Đôi khi hay đúng hơn là tôi nên nói 5/10 lần tôi nhận được lỗi này: - "thời gian chờ trong khi Internet Explorer bận rộn"

Cách khắc phục sự cố này ??

Trả lời

9

Có thể trường hợp IE không được xử lý đúng cách. Bạn sẽ muốn kiểm tra Trình quản lý tác vụ và xem có bao nhiêu quy trình IEXPLORE.EXE mở mà bạn đang chạy. Nếu bạn có nhiều hơn hai, tôi sẽ đề nghị thực hiện một khối sử dụng và sau đó kiểm tra Task Manager lần nữa:

using (IE ie = new IE(URLs.mainURL) 
{ 
    ... 
} 

Một giải pháp tốt hơn là nên sử dụng phương pháp AttachTo một khi bạn đã khởi tạo một "bậc thầy" biến dụ trình duyệt :

private IE ie = new IE(); 

public void btnStartBrowsing_Click(object sender, EventArgs e) 
{ 
    using ie2 = ie.AttachTo<IE>(Find.ByUrl(URLs.mainURL)) 
    { 
     ... 
    } 
} 

UPDATE: vì bạn cần truy cập vào trình duyệt trong suốt thời gian của phiên giao dịch, tôi sẽ đề nghị sử dụng một đối tượng singleton đến nhà đối tượng trình duyệt:

public sealed class BrowserIE 
{ 
    static readonly IE _Instance = new IE(); 

    static BrowserIE() 
    { 
    } 

    BrowserIE() 
    { 
    } 

    public static IE Instance 
    { 
     get { return _Instance; } 
    } 
} 

Trình duyệt chỉ mở một lần và bạn có thể truy cập vào bất cứ khi nào bạn cần, vì bạn không phải khởi tạo thủ công. Để sử dụng nó, bạn chỉ cần gọi thuộc tính Instance mỗi lần bạn cần truy cập vào trình duyệt:

BrowserIE.Instance.GoTo(URLs.mainURL); 
Divs headerDivs = BrowserIE.Instance.Divs.Filter(Find.ByClass("header")); 
+0

Xin lỗi vì đã trả lời trễ Neil T nhưng tôi đã xem xét nhiều kiến ​​trúc khác nhau để thực hiện nhưng vẫn còn Tôi đã gặp lỗi thứ ........ Hơn nữa tôi cần sử dụng cá thể cho toàn bộ thời gian chạy ứng dụng. .............................. và các bạn hãy giúp tôi trong câu hỏi này cũng http://stackoverflow.com/questions/3766784/problem-in-updating-datagridview-via-a-thread-khi-scrolling –

13

Có thể là điều kiện chạy thử tăng thời gian chờ trước khi bạn khởi tạo đối tượng tức là.

Như thế này:

Settings.AttachToBrowserTimeOut = 240; 
    Settings.WaitUntilExistsTimeOut = 240; 
    Settings.WaitForCompleteTimeOut = 240;    
3

tôi sử dụng lớp này để đính kèm vào trình duyệt. Và nó hoạt động tốt.

public class StaticIE : IDisposable 
{ 
    private IE _ie; 
    private int _ieThread; 
    private string _ieHwnd; 
    private int _processId; 

    public StaticIE(IE aBrowser) 
    { 
     SetBrowser(aBrowser); 
    } 

    public IE Browser 
    { 
     get 
     { 
      var currentThreadId = GetCurrentThreadId(); 
      _ie = Browser.AttachTo<IE>(Find.By("hwnd", _ieHwnd), 1); 
      if (currentThreadId != _ieThread) 
      { 
       _ieThread = currentThreadId; 
      } 
      return _ie; 
     } 
    } 

    private void SetBrowser(IE aBrowser) 
    { 
     _ie = aBrowser; 
     _ieHwnd = _ie.hWnd.ToString(); 
     _ieThread = GetCurrentThreadId(); 
     _processId = _ie.ProcessID; 
    } 

    private int GetCurrentThreadId() 
    { 
     return Thread.CurrentThread.GetHashCode(); 
    } 

    public void Dispose() 
    { 
     if (_ie != null) 
     { 
      Process.GetProcessById(_processId).Kill(); 
      _ie = null; 
     } 
    } 
} 
1
Process[] processes = Process.GetProcessesByName("iexplore"); 

     foreach (Process process in processes) 
     { 
      process.Kill(); 
     } 

Đó mã trên giải quyết vấn đề của tôi. Chỉ đơn giản là giết chết IE trên mỗi lần chạy, do nó vẫn chạy.

+0

+1, hoạt động cho tôi. Nhưng thay vì giết "iexplore" thay vì "iexplorer" :-) –

+0

opps, cố định, cảm ơn vì đã chỉ ra lỗi chính tả đó>< – scott

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