몇 가지 자동화 된 테스트에 WatiN을 사용하고 있는데, 모든 테스트에 대해 IE 인스턴스를 만드는 것이 확장 가능하지 않다는 것을 발견했습니다. 각 IE 인스턴스의 생성과 종료 시간은 나를 살아 먹고 있었다 :응용 프로그램을 종료하기 전에 개체를 처형 할 수 있도록하려면 어떻게합니까?
[TestMethod]
public void Verify_Some_Useful_Thing()
{
using (var browser = new IE())
{
browser.GoTo("/someurl");
// etc..
// some assert() statements
}
}
그러나, using 문을 사용한다는 점에서 유용 않았다 난 항상 내 IE 인스턴스가 처분() 메소드가 종료 것이다라는 것이다 보장 할 수 있습니다 IE 윈도우.
public class BrowserPool
{
private static readonly Lazy<BrowserPool> _instance = new Lazy<BrowserPool>(() => new BrowserPool());
private IE _browser;
private string _ieHwnd;
private int _threadId;
public IE Browser
{
get
{
var currentThreadId = GetCurrentThreadId();
if (currentThreadId != _threadId)
{
_browser = IE.AttachTo<IE>(Find.By("hwnd", _ieHwnd));
_threadId = currentThreadId;
}
return _browser;
}
set
{
_browser = value;
_ieHwnd = _browser.hWnd.ToString();
_threadId = GetCurrentThreadId();
}
}
/// <summary>
/// private to prevent direct instantiation.
/// </summary>
private BrowserPool()
{
Browser = new IE();
}
/// <summary>
/// Get the current executing thread's id.
/// </summary>
/// <returns>Thread Id.</returns>
private int GetCurrentThreadId()
{
return Thread.CurrentThread.GetHashCode();
}
/// <summary>
/// Accessor for instance
/// </summary>
public static BrowserPool Instance
{
get
{
return _instance;
}
}
}
그리고 지금 테스트 : :
어쨌든, 내 모든 시험 내 모든 테스트 클래스를 통해 사용하는 하나의 IE 인스턴스 유지 싱글 생성이 잘 작동
[TestMethod]
public void Verify_Some_Useful_Thing()
{
var browser = BrowserPool.Instance.Browser;
browser.GoTo("/someurl");
// some assertions
}
및 내 테스트는 훨씬 빨리 실행되므로 IE를 열거 나 닫지 않을 것입니다. 그러나 테스트가 완료되면 IE 인스턴스가 여전히 열려있을 것이므로이 문제점이 있습니다.
응용 프로그램이 끝나기 전에 BrowserPool.Browser가 dispose() 또는 close()를 호출하도록하는 우아한 방법을 이해할 수 없습니다. BrowserPool 클래스에서 finalizer를 사용하여 시도해 보았지만 파이널 라이저가 호출되었을 때 _browser 변수가 이미 교정되었으므로 작동하지 않는 것 같습니다.
테스트를 실행 한 후 IE 인스턴스에서 dispose()가 호출되도록하려면 어떻게해야합니까?
싱글 톤의 소멸자에 처분을 시도 했습니까? –
@ M.Babcock, 나는 가지고 있고 작동하지 않았다. 브라우저 변수는 소멸자가 호출 될 때까지 이미 회수되었습니다. – KingNestor