Stumbled upon this post about how to catch server errors for your WatiN tests. The approach outlined provides a decent mechanism for detecting server errors by sub-classing the WatiN IE object. While I do appreciate the ability to subclass, it bothers me a bit that I have to write the logic in my subclass to detect server errors. After poking around a bit, I think there's a more generic approach that can be achieved by tapping into the NavigateError event of the native browser: public class MyIE : IE
{
private InternetExplorerClass ieInstance;
private NavigateError error;
public MyIE()
{
ieInstance = (InternetExplorerClass) InternetExplorer;
ieInstance.BeforeNavigate += BeforeNavigate;
ieInstance.NavigateError += NavigateError;
}
public override void WaitForComplete()
{
base.WaitForComplete();
if (error != null)
{
throw new ServerErrorException(Text);
}
}
void BeforeNavigate(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Cancel)
{
error = null;
}
void NavigateError(object pDisp, ref object URL, ref object Frame, ref object StatusCode, ref bool Cancel)
{
error = new NavigateError(URL,StatusCode);
}
private class NavigateError
{
public NavigateError(object url, object statusCode)
{
_url = url;
_statusCode = statusCode;
}
private object _url;
private object _statusCode;
}
}
public class ServerErrorException : Exception
{
public ServerErrorException(string message) : base(String.Format("A server error occurred: {0}",message))
{ }
}
Few caveats:
Constructor of MyIE needs to be updated to reflect the other constructor overloads.
Need to ensure that URL of NavigateError is the same URL of BeforeNavigate
Test library needs to reference the Interop.SHDocVw wrapper for Internet Explorer
Only tested with IE7
While I wouldn't consider COM Interop to be a "clean" solution, it is more bit more portable between solutions. And if it was this easy, why isn't it part of WatiN anyway?
"Catching server errors with WatiN: redux"
No comments yet. -