【问题标题】:Link object persisting across multiple pages within one browser instance using WatiN使用 WatiN 在一个浏览器实例中跨多个页面的链接对象
【发布时间】: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 对象吗?

【问题讨论】:

    标签: c# watin


    【解决方案1】:

    好的,所以我已经设法找出导致我的 Link 对象(和父 Page 对象)跨多个 URL 持续存在的原因。

    似乎因为我单击了在 IE9 中强制“另存为”框的链接,这使 Page 对象保持当前状态,即使浏览器在后台运行所有其他 URL。这似乎会更新窗口中呈现的 HTML,但不会释放现有的 Page 对象(或可能在内存中创建额外的 Page 对象)。

    因为我使用 SendKeys() 来点击“保存”按钮,而不是在 WatiN 中处理对话框,所以对话框保持打开状态并保留 Page 对象。

    从表面上看,我需要找到一种不同的处理方式来执行我的文件下载/保存。

    【讨论】:

    • 值得注意的是,我已经找到了一种解决方法,尽管它涉及使用 Firefox(v3.6 是目前 WatiN 支持的最新版本)。 Firefox 实现似乎可以正确释放对象,所以我只能假设它是 WatiN IE9 支持中的错误或与 IE9 中的新对话框样式有关。
    猜你喜欢
    • 2011-08-25
    • 2015-09-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多