Работа с JavaScript в TWebBrowser (EdgeOnly) и решение проблем TEdgeBrowser в Delphi
В этой статье мы рассмотрим, как выполнять JavaScript в компоненте TWebBrowser при работе в режиме EdgeOnly, а также разберем распространенные проблемы с компонентом TEdgeBrowser в Delphi и способы их решения.
Выполнение JavaScript в TWebBrowser (EdgeOnly)
Хотя TWebBrowser в режиме EdgeOnly использует движок Edge (WebView2), он не предоставляет прямого метода для выполнения JavaScript, в отличие от TEdgeBrowser. Однако это возможно реализовать через интерфейсы COM.
Вот пример выполнения JavaScript в TWebBrowser:
procedure ExecuteJavaScript(WebBrowser: TWebBrowser; const Script: string);
var
Document: IDispatch;
HTMLDocument: IHTMLDocument2;
Window: IHTMLWindow2;
OleResult: OleVariant;
begin
Document := WebBrowser.Document;
if not Assigned(Document) then Exit;
if Document.QueryInterface(IHTMLDocument2, HTMLDocument) = S_OK then
begin
Window := HTMLDocument.parentWindow;
if Assigned(Window) then
begin
try
Window.execScript(Script, 'JavaScript');
except
on E: Exception do
ShowMessage('Ошибка выполнения JavaScript: ' + E.Message);
end;
end;
end;
end;
Для получения результата выполнения скрипта можно модифицировать код:
function ExecuteJavaScriptWithResult(WebBrowser: TWebBrowser; const Script: string): string;
var
Document: IDispatch;
HTMLDocument: IHTMLDocument2;
Window: IHTMLWindow2;
OleResult: OleVariant;
begin
Result := '';
Document := WebBrowser.Document;
if not Assigned(Document) then Exit;
if Document.QueryInterface(IHTMLDocument2, HTMLDocument) = S_OK then
begin
Window := HTMLDocument.parentWindow;
if Assigned(Window) then
begin
try
OleResult := Window.eval(Script);
Result := VarToStr(OleResult);
except
on E: Exception do
ShowMessage('Ошибка выполнения JavaScript: ' + E.Message);
end;
end;
end;
end;
Проблемы с TEdgeBrowser и их решение
Из описанной проблемы видно, что TEdgeBrowser не инициализируется, несмотря на наличие WebView2Loader.dll. Рассмотрим возможные решения.
1. Проверка событий инициализации
Убедитесь, что вы правильно подписались на события:
procedure TForm1.FormCreate(Sender: TObject);
begin
EdgeBrowser1.OnCreateWebViewCompleted := EdgeBrowserCreateWebViewCompleted;
EdgeBrowser1.OnProcessFailed := EdgeBrowserProcessFailed;
end;
procedure TForm1.EdgeBrowserCreateWebViewCompleted(Sender: TObject; AResult: HRESULT);
begin
Memo1.Lines.Add('WebView создан. Результат: ' + IntToStr(AResult));
if Succeeded(AResult) then
EdgeBrowser1.Navigate('https://example.com');
end;
procedure TForm1.EdgeBrowserProcessFailed(Sender: TObject;
AErrorCode: HRESULT; const AArgs: ICoreWebView2ProcessFailedEventArgs);
begin
Memo1.Lines.Add('Ошибка процесса WebView2: ' + IntToStr(AErrorCode));
end;
2. Проверка версии WebView2Loader.dll
Убедитесь, что используется актуальная версия WebView2Loader.dll. Вы можете скачать последнюю версию с официального репозитория Microsoft.
3. Проверка архитектуры DLL
Важно использовать правильную версию WebView2Loader.dll (x86 или x64) в соответствии с архитектурой вашего приложения. В Delphi 12.3 для Windows 11 ARM вам может потребоваться специальная версия.
4. Явное создание окружения WebView2
Попробуйте явно создать окружение перед использованием TEdgeBrowser:
Если проблемы с TEdgeBrowser не удается решить, рассмотрите использование альтернативного компонента WebView4Delphi, который предоставляет более современный API для работы с WebView2.
Пример использования WebView4Delphi:
procedure TForm1.Button1Click(Sender: TObject);
var
JS: string;
begin
// Навигация
WebView1.Navigate('https://example.com');
// Выполнение JavaScript после загрузки
WebView1.OnNavigationCompleted := procedure(Sender: TObject; Args: TNavigationCompletedArgs)
begin
JS := 'document.title';
WebView1.ExecuteScript(JS,
procedure(const AResult: string; AErrorCode: HRESULT)
begin
if Succeeded(AErrorCode) then
ShowMessage('Результат: ' + AResult)
else
ShowMessage('Ошибка: ' + IntToStr(AErrorCode));
end);
end;
end;
Заключение
Для выполнения JavaScript в TWebBrowser (EdgeOnly) можно использовать методы execScript или eval через COM-интерфейсы. Однако, если вам требуется более современный и надежный подход, рекомендуется использовать TEdgeBrowser или альтернативные решения, такие как WebView4Delphi.
При проблемах с TEdgeBrowser проверьте:
- Подписку на события инициализации
- Версию и архитектуру WebView2Loader.dll
- Явное создание окружения WebView2
- Альтернативные компоненты для работы с WebView2
Использование современных компонентов для работы с WebView2 предоставляет более широкие возможности и лучшее взаимодействие с JavaScript, что делает их предпочтительным выбором для новых проектов.
Статья посвящена работе с JavaScript в TWebBrowser (EdgeOnly) и решению распространенных проблем с компонентом TEdgeBrowser в Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS