public void Run(WebBrowser webBrowser, string rootUrl, string pageTypes, string languageBranch, string testIDs, int maxPages = -1)
        {
            IEnumerable<string> pageUrls = GetDescendantPages(
                webBrowser, rootUrl, pageTypes, string.IsNullOrWhiteSpace(languageBranch) ? null : languageBranch);

            IEnumerable<ITest> tests = GetTestCases(testIDs);

            SetupErrorPages(webBrowser, rootUrl, languageBranch);

            var typeDictionary = new PageTypeDictionary(webBrowser.BaseUrl, maxPages);

            foreach (var pageUrl in pageUrls)
            {
                if (typeDictionary.ShouldProcess(pageUrl))
                {
                    webBrowser.NavigateToPage(pageUrl);
                    foreach (var test in tests)
                    {
                        try
                        {
                            test.Initialize(this, webBrowser);
                            test.Execute(webBrowser);

                            _results.Add(new TestResult() {Passed = true, TestID = test.ID, PageUrl = pageUrl});
                        }
                        catch (Exception ex)
                        {
                            _results.Add(new TestResult()
                            {
                                Passed = false,
                                TestID = test.ID,
                                PageUrl = pageUrl,
                                Message = ex.Message,
                                InnerException = ex.InnerException
                            });
                        }
                    }
                }
            }

            foreach (var test in tests)
            {
                try
                {
                    test.FinalExecute(webBrowser);                                        
                }
                catch (Exception ex)
                {
                    _results.Add(new TestResult() { Passed = false, TestID = test.ID, PageUrl = string.Empty, Message = ex.Message, InnerException = ex.InnerException });
                }
            }
        }