Watin - обработка диалогов подтверждения с помощью ConfirmDialogHandler - PullRequest
15 голосов
/ 19 мая 2009

Используя Watin, я пытаюсь обработать диалоговое окно подтверждения и сказать watin, чтобы нажать «ОК». Это хорошо документировано в Интернете - вы используете ConfirmDialogHandler и UseDialogOnce метод. За исключением того, что он не работает для меня. Я получаю следующую ошибку:

WatiN.Core.Exceptions.WatiNException: Dialog not available within 5 seconds

Я использую бета-атм watin 2.0, но ранее я использовал более раннюю версию 1.X, которая имела ту же проблему. Протестировано на компьютере коллег с 64-битной Vista, у меня 64-битная Windows 7.

Код выглядит так:

        using (IE ie = new IE("http://localhost/TestApp/TestConfirmPage.asp"))
        {
            var approveConfirmDialog = new ConfirmDialogHandler();

            using (new UseDialogOnce(ie.DialogWatcher, approveConfirmDialog))
            {
                ie.Button(Find.ByName("btn")).ClickNoWait();
                approveConfirmDialog.WaitUntilExists(5);
                approveConfirmDialog.OKButton.Click();
            }
            ie.WaitForComplete();
        }

Страница ASP очень проста, она состоит из кнопки, которая вынуждает подтвердить, как это:

<input type="button" name="btn" id="btn" value="Click me" onclick="ConfirmApp()"  />

И ConfirmApp был сокращен для тестирования, так что теперь все, что он содержит:

 bOK = confirm("You clicked a popup. Did you mean to?");
 return bOK;

Ответы [ 4 ]

11 голосов
/ 27 мая 2009

Код выглядит хорошо для меня, и я думаю, что он должен работать. Единственная мысль, которую я сделал по-другому, - это поместить Wait for Complete внутрь, используя блок Dialog. Не знаю почему, но до этого у меня тоже были некоторые проблемы, иногда это работает, иногда нет. И я не использую ограничение по времени в ожидании, пока не будет. Но вы, вероятно, уже попробовали это.

Например:

using (new UseDialogOnce(ie.DialogWatcher, approveConfirmDialog))
        {
            ie.Button(Find.ByName("btn")).ClickNoWait();
            approveConfirmDialog.WaitUntilExists();
            approveConfirmDialog.OKButton.Click();
            ie.WaitForComplete();
        }
2 голосов
/ 08 декабря 2012

У меня была та же проблема, и я пробовал много вещей, но просто пропустил одну часть, которую я вызывал .Click (), а затем просто изменил ее на .ClickNoWait (), и все было отсортировано. Надеюсь, это поможет

1 голос
/ 19 марта 2012

Я столкнулся с той же проблемой, и независимо от того, что я делаю, она не работала, пока я не нашел обходной путь, который требует времени, но работает для меня.

Время по умолчанию для WaitUntilExists() составляет 30 секунд , поэтому при использовании его в IE9 предоставьте расширенный лимит времени следующим образом.

handler.WaitUntilExists(40); // or whatever time suits you above 30

Конечно, это займет время, но это работает.

0 голосов
/ 30 октября 2013

Просто потратил пару часов с вариациями решения для просмотра диалогов. У меня ничего не получалось в IE9.

Я закончил с одной строкой, которая работает для меня, надеюсь, это поможет кому-то еще! Этот подход полностью исключает попытки обработки диалога, используя вместо этого нажатия клавиш пользователя.

  • Для ОК. Сделайте все шаги, ведущие к кнопке ClickNoWait, затем:

SendKeys.SendWait ( "{ENTER}");

  • Для ОТМЕНЫ. Сделайте все шаги, ведущие к элементу ClickNoWait, затем: SendKeys.SendWait ( "{TAB}"); SendKeys.SendWait ( "{ENTER}");

Примечание: использование System.Windows.Forms

...