Диалоговое окно подтверждения обработки WatiN в Firefox

Я нашел этот код на SO для автоматического закрытия диалогового окна подтверждения, но он не работает в Firefox.

Проблема в том, var windowButton = new WindowsEnumerator().GetChildWindows(window.Hwnd, w => w.ClassName == "Button" && new WinButton(w.Hwnd).Title == "OK").FirstOrDefault();

Всегда возвращает ноль. Есть ли другой способ получить дескриптор диалоговой кнопки в Firefox?

public class OKDialogHandler : BaseDialogHandler {

public override bool HandleDialog(Window window) {

    var button = GetOKButton(window);
    if (button != null) {
        button.Click();
        return true;
    } else {
        return false;
    }
}

public override bool CanHandleDialog(Window window) {
    return GetOKButton(window) != null;
}

private WinButton GetOKButton(Window window) {
    var windowButton = new WindowsEnumerator().GetChildWindows(window.Hwnd, w => w.ClassName == "Button" 
        && new WinButton(w.Hwnd).Title == "OK").FirstOrDefault();


    if (windowButton == null)
        return null;
    else
        return new WinButton(windowButton.Hwnd);
 }
}

person Chris Kooken    schedule 13.04.2011    source источник


Ответы (1)


Элементы управления в диалоговом окне Firefox alert() не перечислимы. То есть они не существуют как отдельные окна, как в IE. Лучший способ приблизиться к этому — создать новый класс DialogHandler, который реализует IDialogHandler. В конструкторе вы можете передать экземпляр Firefox, для которого отображается диалоговое окно, и вы можете использовать следующий код, чтобы отправить JavaScript в Firefox для управления диалоговым окном:

FFDocument nativeDoc = firefox.NativeDocument as FFDocument;

// ClientPort has several WriteAndRead... functions, 
// and takes a variable list of arguments for the script 
// to be executed.
nativeDoc.ClientPort.WriteAndRead(script);

Вы можете использовать приведенный ниже код JavaScript, чтобы нажать кнопки «ОК» и «Отмена» в диалоговом окне предупреждения () или подтверждения ().

private const string DialogIsConfirmScript = "typeof getWindows()[{0}].document.documentElement.getButton('accept') !== 'undefined' && typeof getWindows()[{0}].document.documentElement.getButton('cancel') !== 'undefined';";
private const string DialogIsAlertScript = "typeof getWindows()[{0}].document.documentElement.getButton('accept') !== 'undefined' && typeof getWindows()[{0}].document.documentElement.getButton('cancel') !== 'undefined' && getWindows()[{0}].document.documentElement.getButton('cancel').hidden;";
private const string ClickCancelButtonScript = "getWindows()[{0}].document.documentElement.getButton('cancel').click()";
private const string ClickOKButtonScript = "getWindows()[{0}].document.documentElement.getButton('accept').click()";
private const string WindowClassName = "MozillaDialogClass";

Более полная реализация, включающая встроенную обработку IE alert() и confirm() в общий интерфейс и добавляющая обработку Firefox, доступна по адресу http://pastebin.com/ZapXr9Yf

person JimEvans    schedule 13.04.2011
comment
класс firefox, похоже, не имеет свойства NativeDialog. Пожалуйста, порекомендуйте. - person Chris Kooken; 13.04.2011
comment
Нет, это не так. Я имел в виду НативДокумент. Я отредактировал свой ответ. - person JimEvans; 13.04.2011
comment
K, ClientPort там не существует. Запустить скрипт()? - person Chris Kooken; 13.04.2011
comment
Нет, вам придется привести его к FFDocument. Вы действительно должны взглянуть на ссылку с более полной реализацией. - person JimEvans; 13.04.2011