我正在使用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
答案 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
}
}