One question have troubled me for some time when automating Internet Explorer (actually, I am doing web testing with Watin): how to test for HTTP status codes. Finally, I figured out how to do this. The lies in an event that the InternetExplorer object raises when navigation is unsuccessful.
I ended up with writing a C# helper class:
using System.Net;
using WatiN.Core;
using SHDocVw;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Globalization;
namespace Test
{
public class NavigationObserver
{
private HttpStatusCode _statusCode;
public NavigationObserver(IE ie)
{
InternetExplorer internetExplorer = (InternetExplorer)ie.InternetExplorer;
internetExplorer.NavigateError += new DWebBrowserEvents2_NavigateErrorEventHandler(IeNavigateError);
}
public void ShouldHave(HttpStatusCode expectedStatusCode)
{
if (!_statusCode.Equals(expectedStatusCode))
{
Assert.Fail(string.Format(CultureInfo.InvariantCulture, "Wrong status code. Expected {0}, but was {1}",
expectedStatusCode, _statusCode));
}
}
private void IeNavigateError(object pDisp, ref object URL, ref object Frame, ref object StatusCode, ref bool Cancel)
{
_statusCode = (HttpStatusCode)StatusCode;
}
}
}
Note that I use Visual Studio test runner to run my web tests. Then, I can use this in my test:
using (IE ie = new IE())
{
NavigationObserver observer = new NavigationObserver(ie);
ie.GoTo("http://some.where.com");
observer.ShouldHave(HttpStatusCode.NotFound);
}