Объект ссылки сохраняется на нескольких страницах в одном экземпляре браузера с помощью WatiN - PullRequest
1 голос
/ 08 сентября 2011

Я только начинаю работать с WatiN и пытаюсь протестировать большое количество страниц с аутентификацией. Я использовал только создание нового экземпляра IE каждый раз, когда требуются новые данные для входа. После аутентификации фреймворк должен перейти на 2 страницы сайта и щелкнуть ссылку на каждой из них, чтобы загрузить файл (повторяется несколько раз в течение одного сеанса аутентификации для разных клиентов).

Навигация по страницам в порядке, и загрузка работает с IE9, используя комбинацию WatiN и SendKeys (). Однако, когда он переходит на вторую страницу и пытается найти объект Link по тексту (который имеет тот же текст, что и на предыдущей странице), он возвращает 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 для каждого запроса?

1 Ответ

1 голос
/ 12 сентября 2011

Хорошо, мне удалось выяснить, что заставляло мой объект Link (и родительский объект Page) сохраняться в нескольких URL-адресах.

Кажется, что из-за того, что я щелкаю ссылку, которая вызывает окно «Сохранить как» в IE9, это сохраняет объект страницы текущим, даже когда браузер просматривает все другие URL-адреса в фоновом режиме. Кажется, это обновляет HTML-код, отображаемый в окне, но не освобождает существующий объект Page (или, возможно, создает дополнительные объекты Page в памяти).

Поскольку я использую SendKeys (), чтобы нажать кнопку «Сохранить», а не обработанный диалог в WatiN, этот диалог остается открытым и сохраняет объект Page.

Судя по всему, мне нужно найти другой, обработанный способ загрузки / сохранения моих файлов.

...