【发布时间】:2011-11-13 02:58:15
【问题描述】:
我刚刚开始使用 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 对象吗?
【问题讨论】: