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