Обход System.UnauthorizedAccessException: доступ запрещен - PullRequest
1 голос
/ 21 января 2011

Я использую Waitin RC2, WatiN-2.0.20.1089, ОС Windows XP с IE8 с VS2008 и NUnit-2.5.7.10213. Я добавил сайты в список доверенных, у меня спит тема, я попробовал "WaitForComplete". Тем не менее, когда сценарий возвращается «назад», я получаю исключение неавторизованного доступа. Вот часть моего кода, исключения никогда не перехватываются, несмотря на то, что большая часть кода находится в блоках try catch.

публичная строка FindAllLinks ()

    {
        /*
         * This function is designed to find and use all of the links on a given page.
         * After clicking on a link it waits for 400 milliseconds on the page so the page
         * has some time to load and then the function "hits the back button" reseting 
         * to the originating page.
         * This function is not meant to be recursive.
         */

        string message = "";
        bool flag = true;

        //Get a list of all links from the browser instance
        foreach (Link link in browserInstance.Links)
        {
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine(link);
            try
            {//clicking on the link to make sure it leads somewhere
                link.Click();  //If the click fails hopefull we will thrwo out of the try block and not execute the next two commands.
                //Console.WriteLine(link);
            }
            catch (Exception)
            {//OOPs we have an error let's log a message.
                message = message + "The link titled " + link + " was not found, or did not work.\n";
                flag = false;
            }

            if (flag)
            {
                System.Threading.Thread.Sleep(1000);
                //browserInstance.WaitForComplete;
                try { browserInstance.Back(); }
                catch (UnauthorizedAccessException)
                {
                    //do nothing
                }
            }//close if flag

        }//close for each

        //return the message
        return (message);

    }//Close function


    [STAThread]
    [Test]
    public void TestTitleHomePage()
    {
        bool testPassed = false;

        if (browserInstance.Title.Contains("<title>"))

        {

            string message = FindAllLinks();

            if (message == "") { testPassed = true; }

        }//close if

        else { message = "The Title was not the same."; }


        Assert.IsTrue(testPassed, message);


    }// end TestTitleHomePage

1 Ответ

3 голосов
/ 21 января 2011

Я попробовал ваш код, и я также получил исключение.Я думаю, что понимаю, что происходит.Когда вы в первый раз делаете Browser.Links, вы получаете все ссылки текущей страницы, затем вы переходите на другую страницу и возвращаетесь на первую страницу, но для WatiN это новая страница.Таким образом, ваше перечисление не может работать, потому что вы перечисляете по ссылкам первой страницы.

Что я могу предложить, так это получить все Uri ссылок, а затем попробовать их один за другим в новом браузере

IEnumerable<Uri> uris = Browser.Links.Select(l => l.Uri);
foreach(Uri uri in Uris)
{
   try 
   {
      using(var browser = new IE(uri))
      {
          // do nothing or detect 404, 403, etc errors
      }

      // no error
   }
   catch(exception)
   {
      // log error
   }
}
...