绕过System.UnauthorizedAccessException:访问被拒绝

时间:2011-01-21 00:59:38

标签: c# internet-explorer-8 watin

我正在使用Waitin RC2,WatiN-2.0.20.1089,Windows XP操作系统,IE8和VS2008以及NUnit-2.5.7.10213。我已将网站添加到可信列表,我有线程睡眠,我尝试过“WaitForComplete”。但当脚本“退回”时,我仍然会收到未经授权的访问异常。 这是我的一大块代码,尽管大多数代码都在try catch块中,但是从来没有捕获过异常。

public string 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 个答案:

答案 0 :(得分:3)

我尝试了你的代码,我也得到了例外。我想我明白会发生什么。当您第一次执行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
   }
}