В статье рассматривается проблема, с которой сталкиваются разработчики, использующие компонент TWebBrowser в приложениях на Delphi для автоматизации навигации по веб-приложениям. Основная проблема заключается в том, что браузер Internet Explorer может отображать известное всплывающее окно с вопросом "Вы уверены, что хотите покинуть эту страницу?", что препятствует дальнейшей навигации до тех пор, пока пользователь не подтвердит действие. Решение этой проблемы требует введения специального кода, который позволит избежать этого всплывающего сообщения без изменения кода целевого веб-сайта.
Проблема
Иногда при использовании компонента TWebBrowser в приложениях на Delphi для автоматизации навигации по веб-приложениям, Internet Explorer показывает всплывающее окно с вопросом о подтверждении выхода с текущей страницы. Это сообщение появляется из-за обработчика события window.onbeforeunload, который часто используется на страницах для предупреждения пользователя о потере несохраненных изменений. В случае автоматизированной навигации это сообщение становится проблемой, так как приложение не может продолжить свою работу до тех пор, пока пользователь не подтвердит выход.
Предложенные решения
Введение скрипта для сброса обработчика события onbeforeunload: Можно использовать скрипт, который будет сбрасывать обработчик события onbeforeunload на каждой странице. Это требует ввода кода на уровне интерфейсов COM, таких как IWebBrowser2, IHTMLDocument2, IHTMLScriptElement. Например, можно использовать метод navigate2 с JavaScript-выражением для выполнения сброса обработчика.
pascal
var
WrkIHTMLWindow2: IHTMLWindow2;
WrkIHTMLWindow2Disp: IHTMLWindow2Disp;
begin
WrkIHTMLWindow2 := IHTMLDocument2Disp(WrkIWebBrowser2.Document).parentWindow;
if WrkIHTMLWindow2.QueryInterface(IHTMLWindow2Disp, WrkIHTMLWindow2Disp) = S_OK then
WrkIHTMLWindow2Disp.onbeforeunload := NULL;
end;
Использование компонента TEmbeddedWB: Существует также альтернативный компонент TEmbeddedWB, который представляет улучшенную версию TWebBrowser с расширенными возможностями.
Периодический сброс обработчика с помощью интервала: Можно встроить JavaScript, который будет периодически перезаписывать обработчик onbeforeunload на функцию, которая ничего не делает.
javascript
(function () {
var onbeforeunloadHandler = function (ev) {
if (ev) {
if (ev.stopPropagation)
ev.stopPropagation();
if (ev.stopImmediatePropagation)
ev.stopImmediatePropagation();
ev.returnValue = undefined;
}
window.event.returnValue = undefined;
}
var handler = null;
var intervalHandler = function () {
if (handler)
window.detachEvent("onbeforeunload", handler);
handler = window.attachEvent("onbeforeunload", onbeforeunloadHandler);
};
window.setInterval(intervalHandler, 500);
intervalHandler();
})();
Подтвержденное решение
Разработчикам, которые не хотят вдаваться в тонкости работы с COM-интерфейсами, рекомендуется использовать следующий подход: при загрузке документа вызвать метод navigate2 с JavaScript-выражением, которое сбросит обработчик onbeforeunload. Это не является элегантным решением, но позволяет избежать появления раздражающего сообщения.
При автоматизации навигации по веб-сайтам с помощью TWebBrowser в Delphi, важно учитывать, что веб-страницы могут использовать различные методы для предупреждения пользователя о потере данных. Разработчикам следует быть готовыми к решению таких проблем, как всплывающие окна подтверждения выхода, и иметь инструменты для их обхода в рамках закона и этических норм.
Автоматическая навигация без помех достигается путем обхода всплывающего окна подтверждения выхода в Internet Explorer, используемом в компоненте `TWebBrowser` в приложениях на Delphi, с помощью сброса обработчика события `onbeforeunload`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.