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

Используя 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;

person Matt Roberts    schedule 19.05.2009    source источник
comment
Связано: stackoverflow.com/ questions / 5626538 /   -  person Bill the Lizard    schedule 19.03.2012


Ответы (4)


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

Например:

using (new UseDialogOnce(ie.DialogWatcher, approveConfirmDialog))
        {
            ie.Button(Find.ByName("btn")).ClickNoWait();
            approveConfirmDialog.WaitUntilExists();
            approveConfirmDialog.OKButton.Click();
            ie.WaitForComplete();
        }
person andreja    schedule 27.05.2009
comment
Использование комбинации подобных изменений кода и обновления библиотек DLL отсортировало его. - person Matt Roberts; 13.08.2010

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

person MAK    schedule 08.12.2012

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

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

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

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

person Jawad Hashim    schedule 19.03.2012

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

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

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

SendKeys.SendWait ("{ENTER}");

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

nb: используя System.Windows.Forms

person codefinger    schedule 30.10.2013