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?
No comments:
Post a Comment