Watin - Обработка подтверждений с помощью ConfirmDialogHandler

Используя Watin, я пытаюсь обработать диалоговое окно подтверждения и сообщить watin, чтобы нажать "OK". Это хорошо задокументировано в Интернете - вы используете метод 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;

Ответы

Ответ 1

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

Например:

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

Ответ 2

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

Ответ 3

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

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

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

Конечно, требуется время, но оно работает.

Ответ 4

Просто потратил пару часов с изменениями в решении просмотра диалога. Ничто не работало для меня в IE9.

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

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

SendKeys.SendWait( "{ENTER}" );

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

nb: использование System.Windows.Forms