我刚刚开始使用WatiN并尝试使用身份验证来测试大量页面。每次需要新的登录详细信息时,我都采用了只创建IE新实例的方法。经过身份验证后,框架需要导航到网站上的2个页面,然后单击每个页面上的链接以下载文件(在一个经过身份验证的会话中为不同的客户端重复多次)。
导航到页面很好,下载是使用WatiN和SendKeys()的组合使用IE9。但是,当它导航到第二页并尝试按文本查找链接对象(其具有与上一页相同的文本)时,它将从第一页返回下载URL。这意味着基本上我指向WatiN的任何页面,它似乎仍然是从第一页继承Link对象。
第一种方法创建我的浏览器对象并将其返回给父类:
public IE CreateBrowser(string email, string password, string loginUrl)
{
Settings.MakeNewIe8InstanceNoMerge = true;
Settings.AutoCloseDialogs = true;
IE ie = new IE(loginUrl);
ie.TextField(Find.ById("Email")).TypeText(email);
ie.TextField(Find.ById("Password")).TypeText(password);
ie.Button(Find.ById("btnLogin")).Click();
Thread.Sleep(1500);
return ie;
}
然后我遍历登录,将每个所需页面的URL传递给以下内容:
public void DownloadFile(IE ie, string url)
{
//ie.NativeBrowser.NavigateTo(new Uri(url));
ie.GoTo(url);
Thread.Sleep(1000);
//TODO: Why is link holding on to old object?
Link lnk = null;
lnk = ie.Link(Find.ByText("Download file"));
lnk.WaitUntilExists();
lnk.Focus();
lnk.Click();
//Pause to allow IE file dialog box to show
Thread.Sleep(2000);
//Alt + S to save
SendKeys.SendWait("%(S)");
}
调用方法将它们联系在一起(我已经混淆了一些细节):
for (int i = 0; i < loginCount; i++)
{
using (IE ie = HelperClass.CreateBrowser(lLogins[i].Email, lLogins[i].Password, ConfigurationManager.AppSettings["loginUrl"]))
{
...Gets list of clients we're wanting to check
for (int j = 0; j < clientCount; j++)
{
string url = "";
switch ()
{
case "Page1":
string startDate = "20110831";
string endDate = "20110901";
url = String.Format(page1BaseUrl, HttpUtility.UrlEncode(lClients[j].Name), startDate, endDate);
break;
case "Page2":
url = String.Format(page2BaseUrl, HttpUtility.UrlEncode(lClients[j].Name));
break;
}
HelperClass.DownloadFile(ie, url);
}
}
}
有没有人知道是什么原因造成这种情况或如何绕过它?我是否需要为每个请求创建一个新的IE对象?
答案 0 :(得分:1)
好的,所以我设法找出导致我的Link对象(以及父Page对象)在多个URL中保持不变的原因。
似乎因为我点击了强制IE9中“另存为”框的链接,这使得Page对象保持最新,即使浏览器在后台运行所有其他URL也是如此。这似乎更新了窗口中呈现的HTML,但没有释放现有的Page对象(或者可能在内存中创建额外的Page对象)。
因为我使用SendKeys()来点击“保存”按钮,而不是WatiN中的处理对话框,对话框保持打开状态并保持Page对象。
从外观上看,我需要找到一种不同的处理方式来执行我的文件下载/保存。