Delphi webbrowser ошибка сценария

6 / 6 / 2

Регистрация: 14.12.2013

Сообщений: 117

1

31.07.2014, 10:32. Показов 13899. Ответов 6


Студворк — интернет-сервис помощи студентам

ВебБраузер делает свою работу. Вот только ошибку показывает. Можно как-то их отключить?



0



Mawrat

13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

31.07.2014, 10:45

2

Лучший ответ Сообщение было отмечено KaDima281 как решение

Решение

Погасить вывод диалогов с предупреждениями и сведениями об ошибках:

Delphi
1
  WebBrowser1.Silent := True;



1



6 / 6 / 2

Регистрация: 14.12.2013

Сообщений: 117

31.07.2014, 10:57

 [ТС]

3

Спасибо. А есть какие-то аналоги вебБраузера? (Кроме TChromium)



0



13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

31.07.2014, 11:46

4

Может быть, есть. Надо поискать в сети.



0



Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32593 / 21062 / 8134

Регистрация: 22.10.2011

Сообщений: 36,335

Записей в блоге: 8

31.07.2014, 12:00

5

Mawrat, ничего нет. Mozilla забросила свой плагин, Оперы не было никогда. Только WB да Chromium



2



6 / 6 / 2

Регистрация: 14.12.2013

Сообщений: 117

31.07.2014, 13:51

 [ТС]

6

А то у меня хромиум не запускается. Теперь дельфи заново переустанавливать…



0



Nikita Shibaev

0 / 0 / 0

Регистрация: 28.07.2019

Сообщений: 7

03.06.2021, 14:41

7

У меня тоже была такая проблема с этим компонентом, но я решил это.
Посредством добавления строки

Delphi
1
RegisterAsBrowser:=true;

и совместным использованием этой строки со строкой

Delphi
1
Silent:=true;

у меня решилась эта проблема.



0



Поставил компонент TWebBrowser, загружаю страницу, выходит ошибка сценария. Если игнорировать ошибки путем

WB2.Silent := true;

то ошибки нет, но функционал страницы нарушен.

Как устранить данную проблему и сохранить функционал загружаемой страницы?

  • delphi-7
  • delphi
  • javascript
  • webbrowser

Kromster's user avatar

Kromster

13.6k12 золотых знаков43 серебряных знака72 бронзовых знака

задан 11 июн 2014 в 5:45

АлександрЪ's user avatar

АлександрЪАлександрЪ

2371 серебряный знак16 бронзовых знаков

6

  • Есть подозрение, что никак. Скорее всего, что WebBrowser не поддерживает какие-то объекты или методы, которые использует сценарий.

    11 июн 2014 в 6:07

  • @kot-da-vinci а есть какой-нибудь другой компонент, который может с этим справится?

    11 июн 2014 в 6:40

  • Если он и есть, то я о нем не знаю. WebBrowser разрабатывался более 10 лет назад. А стандарты Web меняются со скоростью света.

    11 июн 2014 в 7:00

  • Грусть( Чтож, @kot-da-vinci спасибо, буду гуглить и пытаться найти решение)

    11 июн 2014 в 7:13

  • @kot-da-vinci, Вы случайно не знакомы с jsWebbrowser? Может ли он помочь выйти из данной ситуации?

    13 июн 2014 в 4:21

1 ответ

ответ дан 23 мая 2017 в 7:34

microup's user avatar

microupmicroup

6654 серебряных знака18 бронзовых знаков

На чтение 8 мин. Опубликовано 15.12.2019

Я использую компоненту TWebBrowser. Встала проблема избаиться от окна «Ошибка сценария Internet Explorer». Оно появляется на многих сайтах в которых есть ошибки в JAVA скриптах. Версия IE — 5.0.
Помогите пожалуйста!


Ihor Osov’yak ( 2003-01-18 22:42 ) [1]

Есть ошибка — значит будет сообщение об ошибке :-).

Зы — если кто-то посоветует Silent установить в true — не слушай его. Ибо в первых, Silent не все сообщения перехватывает — о твоем случае не знаю, нужно экспериментировать. Но проблема не в том – если даже это заблокирует сообщение об ошибке – то это будет равнозначно ответу “не выполнять скрипты более”. А как показывает опыт – сейчас очень модно на всякие линки и кнопки скрипты вешать – следовательно, броузер соотв. клики уже не будет обрабатывать. Со всеми вытекающими последствиями.

Юзание IDOCHOSTSHOWUI (пример реализации смотрим в TEmbeddedWB) тоже вряд ли (когда-то делал эксперименты – сообщения об ошибках здесь тоже не ловятся – но могу ошибиться за древностью – проверьте, если есть желанию).

Делаю так – немного в лоб, но работает наверняка (IE от 5, все винды)

— хук на создание окна для своего потока.
— в хуке смотрим класс окна, если это Internet Explorer_Server — вполне может быть, что это окно с сообщением об ошибке. Тогда – PostMessage на взвод таймера примерно на 0.1 сек – єто нужно для того, что в соотв. окне еще ничего нет. По срабатыванию таймера запрашиваем IHtmlDocument2 от соотв. хидера окна – как это сделать, здесь уже говорили, поищи по ключевым словам ObjectFromLresult,IHtmlDocument2

— парсим соотв. IHtmlDocument2, и если там есть бутончик, в html коде которого есть >


crash123 ( 2003-01-19 10:29 ) [2]

Уважаемый Ihor Osov»yak, если Вас не затруднит, напишите исходный код. Заранее спосибо!


Ihor Osov’yak ( 2003-01-19 11:31 ) [3]

Держи фрагменты, выдернуто с реального проекта, убраны некоторые несущественные детали, но может и не все, посему некоторые фрагменты «будут лишними», также не даю кода всякой мелочовки вида WrTm — это у меня отладочный вывод:

function GetWndClassName(aWnd:THandle):string;
var wS:string;
l:integer;
begin
SetLength(ws,160);
l:=GetClassName(aWnd,PChar(ws),length(ws));
if length(ws)>0
then Result := Copy(ws,1,l)
else Result := «»;
SetLength(ws,0);
end;

Собственно процедура хука.
notifHandle — хендл формы, в которой будем организовать клик по кнопочке, у меня это главная форма,WUM_HookIEFired- юзверовский месидж

При юзании только для своего процесса
оформлять в виде длл необязательно:

function Kah_hook(Code:integer; aWParam:WPARAM; aLParam:LParam):longint; stdcall;
var wnd: dword;

wnd :=aWParam;
fl:= 0;
if code

ну и собственно обработчик WUM_HookIEFired:

procedure TFormMain_DreamMates14_2.WUMHookIEFired(var Msg: TMessage);
begin

if Msg.WParam <> 0 then begin
fHWndHookedIEFrame := Msg.WParam;
fHWndHooked := Msg.LParam;

end
else exit;
TimerHook.Enabled := true;

И обработчик таймера(здесь основная работа) — почему через таймер — я уже говорил — нужно дать время на формирование сообщения, оно начинает формироватся даже не при создании окна, а сразу после активации (у меня такое впечатление сложилось, но в прочем на єтом я не настаиваю — в смысле, когда формируется, но что задержка нужна — это обнозначно, я ставлю 0.2 сек)

type
TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM:
wParam; out pObject): HRESULT; stdcall;

const MSG: Integer = 0;
hInstLib: HWND =0;
ObjectFromLresult: TObjectFromLresult = nil;

function GetIDocFromHWND(WHandle: HWND; var iDoc: IHtmlDocument2): HRESULT;
var
lRes: Cardinal;
begin
Result := S_FALSE;
if hInstLib = 0 then hInstLib := LoadLibrary(«Oleacc.dll»);
if not assigned(ObjectFromLresult) then @ObjectFromLresult := GetProcAddress(hInstLib, «ObjectFromLresult»);
if @ObjectFromLresult <> nil then begin
try
if MSG=0 then MSG := RegisterWindowMessage(«WM_HTML_GETOBJECT»);
SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, iDoc);
finally
//eeLibrary(hInst);
end;
end;
end;

procedure TFormMain_DreamMates14_2.TimerHookTimer(Sender: TObject);
var
WndChild: HWND;
//IE:IWebbrowser2;
iElem:IHtmlElement;
iDoc:IHtmlDocument2;

procedure HtmlCodToLog;
begin
if not assigned(iDoc) then exit;
WrTm(2,»Hooked text:» + GetTxtBoby(iDoc));
WrTm(2,»Hooked html:» + GetHtmlBoby(iDoc));

procedure TryForceCloseHokkedWnd;
var h1,h:thandle;
begin
if fHWndHooked<>0 then begin
PostMessage(fHWndHooked,WM_Close,0,0);
exit;
end;
h1:= fHWndHookedIEFrame;

if ((h=0) or (h=Handle)) then begin
PostMessage(h1,WM_Close,0,0);
exit;
end;
h1 := h;

var s:string;
begin //
try
TimerHook.Enabled := false;

if ((fHWndHookedIEFrame<>0) and (fHWndHooked=0)) then begin

if not assigned(iDoc) then begin

WndChild := FindWindowEX(fHWndHookedIEFrame, 0, «Internet Explorer_Server», nil);
if WndChild=0 then begin
WrTm(2,»TimerHookTimer: cp1″);
WndChild := FindWindowEX(fHWndHooked, 0, «Internet Explorer_Server», nil);
end;
if WndChild=0 then begin
WrTm(2,»TimerHookTimer: cp2″);
Exit;
end;
if GetiDocFromHWND(WndChild,IDoc)<>S_OK then begin
WrTm(2,»TimerHookTimer: cp3″);
exit;
end;
end;
if not assigned(iDoc) then begin
WrTm(2,»TimerHookTimer: cp4″);
exit;
end;

WrTm(0,»** Catch window with a html-warnintg . «);
HtmlCodToLog;

if Pos(«error has occurred in the script on this page»,s)>0 then begin
iElem := GetButtonWithSubstrInOuterHtml2( >if assigned(iElem) then begin
iElem.Click;
WrTm(2,»TimerHookTimer: click on «continue running scripts»»);
exit;
end;
end;


Ihor Osov’yak ( 2003-01-19 11:34 ) [4]

Да, функция постановки хука: 🙂

procedure OnHook(aHNotif:THandle);
begin
if HookHandle<>0 then exit;
notifHandle := aHNotif;
HookHandle:=SetWindowsHookEx(WH_CBT,@Kah_hook,0,GetCurrentThreadId);


int64 ( 2003-01-19 12:57 ) [5]

crash123 (18.01.03 16:48)

Сделай так, и вообще никаких окон не будет. Во всяком случае, посмотри, может получится.

type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
procedure FormCreate(Sender: TObject);
private
FOldWindowProc: TWndMethod;
procedure FormWndProc(var AMsg: TMessage);
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;

procedure TForm1.FormCreate(Sender: TObject);
begin
FOldWindowProc:= WindowProc;
WindowProc := FormWndProc;
WebBrowser1.Navigate(«c: emp1.htm»);
end;

procedure TForm1.FormWndProc(var AMsg: TMessage);
var
ChWnd, wnd: Integer;
Msg: TWmActivate;
i: integer;
s: string;
begin
if AMsg.Msg = WM_ACTIVATE then
begin
Msg := TWmActivate(AMsg);
wnd := Msg.ActiveWindow;
//if . then
SendMessage(wnd, WM_CLOSE, 0, 0);
end;
FOldWindowProc(AMsg);
end;

А если хочешь, чтоб какое-то конкретное окно пропадало, то перед SendMessage(wnd, WM_CLOSE, 0, 0) ставь проверку на корректную идентификацию этого окна.

Ihor Osov»yak © (19.01.03 11:34)
Что-то ты много написал. Может ты практически подходил? А я вот теоритически. )


Ihor Osov’yak ( 2003-01-19 13:48 ) [6]

2 int64 © (19.01.03 12:57)

> Что-то ты много написал. Может ты практически подходил? А я вот теоритически. )

Практик я, практик. 🙂
Для теоретиков повторяю: прибитие окна на взлете равнозначно тисканию на кнопочку «не выполнять более скриптов» — или как она там зовется, пишу по-памяти, что в болшинстве практических случаев ведет к нарушению функционирования сайта — сейчас часто на всякие линки и кнопки скрипты разработчики сайтов вешают.
Хотя в конкретном случае вариант от int64 пройдет. Но нужно быть готовым к тому, что через некоторое время софту доделывать придется, так как авторы сайта подпадут под модные течения и . (см. выше)


Ihor Osov’yak ( 2003-01-19 13:50 ) [7]

Зы
> прибитие окна на взлете равнозначно тисканию на кнопочку
> «не выполнять более скриптов»
— сие проверялось практически и не единыжды 🙂


Ihor Osov’yak ( 2003-01-19 13:57 ) [8]

Зы еще — в коде от int64 наверно есть ошибка — FormWndProc делает сабклассинг для делфийской формы и будет соотв. ловить ее активацию, а не активацию окна с сообщением с ошибкой.
Имхо, активацию окна с ошибкой — только через хуки.

Зы — на сей раз это теоритическое размышление, практически проверять влом. Но думаю, что я прав.


sergey2 ( 2003-01-21 15:00 ) [9]

Я лично у себя написал:

try
WebBrowser1.Navigate(URL);
except
end;

и никаких ошибок не вылазит.

9 TipTop [2011-12-19 22:49:00]

У меня возникли проблемы с обработкой ошибок javascript в WebBrowser на Delphi 2010.

Я использую WebBrowser с включенным тихим свойством. Кажется ОК, но есть одна проблема на сайтах с багги-скриптами: она кажется частью script после того, как ошибка не выполняется. Результаты некоторых script немного отличаются от IE.

Вы знаете, как решить эту проблему?

javascript browser delphi

2 ответа

12 Решение TLama [2011-12-20 18:06:00]

В следующем примере я использовал вставленный класс, поэтому, если вы поместите этот код в свое подразделение, только эти веб-браузеры в форме или созданные в этом устройстве динамически получат это поведение.

Поставил компонент TWebBrowser , загружаю страницу, выходит ошибка сценария. Если игнорировать ошибки путем

то ошибки нет, но функционал страницы нарушен.

Как устранить данную проблему и сохранить функционал загружаемой страницы?

  • 0

dmdel

Ответ от

dmdel,
23 октября, 2016

  • Задать вопрос

Вопрос

dmdel

Contributor

    • Поделиться

В приложении для windows  использую webbrowser следующим образом, 

procedure TForm13.FormCreate(Sender: TObject);
var
  WindowHandle: TWinWindowHandle;
begin
  WindowHandle := WindowHandleToPlatform(Handle);
  FWebBrowser := TWebBrowser.Create(Self);
  FWebBrowser.ParentWindow := WindowHandle.Wnd;
  FWebBrowser.Width := Width;
  FWebBrowser.Height := Height;
//  FWebBrowser.Silent:= true;
  FWebBrowser.Navigate('http://er.yamalzdrav.ru/er/categories/uncategorized/mainpage/');
end;

При отображении сайта  появляется сообщение об ошибках сценария. И сайт отображается некорректно. 

Как это поправить? 

Безымянный.png

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

dmdel

Contributor

  • Автор
    • Поделиться

Если через браузер захожу, то таких проблем нет

Ссылка на комментарий

  • 0

Rusland

Mentor

    • Поделиться

Видимо ошибка javascript на самом сайте. Помню в WebBrowser в VCL было свойство silent, c помощью которого можно было отключить отображение ошибок. К сожалению, в FMX не вижу этого свойства. 

Попробуйте веббраузер ChromiumFMX


Изменено 24 октября, 2016 пользователем Rusland

Ссылка на комментарий

  • 0

dmdel

Contributor

  • Автор
    • Поделиться

59 минут назад, Rusland сказал:

Видимо ошибка javascript на самом сайте. Помню в WebBrowser в VCL было свойство silent, c помощью которого можно было отключить отображение ошибок. К сожалению, в FMX не вижу этого свойства. 

Попробуйте веббраузер ChromiumFMX

Silent пробовал, ошибка не появляется, но все равно сайт отображается некорректно. Часть функционала просто не показывается. 

Попробую ChromiumFMX

Ссылка на комментарий

  • 0

Rusland

Mentor

    • Поделиться

Так у вас VCL что ли? Тогда смотрите Хромиум для VCL (имейте в виду — их две версии dcef3 и dcef1)


Изменено 24 октября, 2016 пользователем Rusland

Ссылка на комментарий

  • 0

dmdel

Contributor

  • 0

dmdel

Contributor

  • Автор
    • Поделиться

Вообщем попробовал  ChromiumFMX .

Скачал отсюда http://www.fmxexpress.com/web-browser-component-for-delphi-xe6-firemonkey-on-windows-and-mac-osx/

Установил компонент, скопировав файлы *.dcu в папку C:Program Files (x86)EmbarcaderoStudio15.0libwin32debug и C:Program Files (x86)EmbarcaderoStudio15.0libwin32release

Компонент установился, проект компилируется, но при запуске приложения ошибка. Вместе с установочником есть пример. Там та же ошибка. Может еще где-нибудь что нибудь не прописал или не скопировал?

Безымянный2.png

Ссылка на комментарий

  • 0

MAD_EVAL

Contributor

    • Поделиться

Положите все библиотеки (*.dll) Хромиума в папку с исполняемым файлом. Плюс как минимум 2 папки с локалями и компонентами движка.

Добавил принтскрин всего того что должно лежать в папке вместе с вашим екзешником.

Это всё есть в архиве, из которого Вы устанавливали компонент в папке cef3_ChromiumXE6binWin32 (или Win64)

Безымянный.png


Изменено 25 октября, 2016 пользователем MAD_EVAL

Добавил

  • Rusland и
    enatechno


  • Like


    2

Ссылка на комментарий

  • 0

dmdel

Contributor

  • Автор
    • Поделиться

7 часов назад, MAD_EVAL сказал:

Положите все библиотеки (*.dll) Хромиума в папку с исполняемым файлом. Плюс как минимум 2 папки с локалями и компонентами движка.

Спасибо! Заработало!

Ссылка на комментарий

  • 0

MAD_EVAL

Contributor

    • Поделиться

22 часа назад, dmdel сказал:

Спасибо! Заработало!

Не за что. Будут вопросы по хромиуму — пишите в личку

Ссылка на комментарий


Гость

Эта тема закрыта для публикации ответов.

  • Последние посетители

      0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

В разработке приложений на Delphi, использующих компонент WebBrowser для отображения веб-страниц, могут возникать ошибки сценария JavaScript.

Такие ошибки могут возникать, если содержимое веб-страницы содержит ошибки в коде JavaScript или если на компьютере пользователя не установлена подходящая версия Microsoft JScript.

Для решения проблемы можно попробовать обновить версию браузера Internet Explorer или установить Microsoft JScript отдельно.

Если проблема не исчезает, можно попробовать отключить выполнение сценариев на странице, используя свойство WebBrowser.ScriptEnabled.

// пример отключения выполнения сценариев на страницеWebBrowser1.ScriptEnabled := False;

у кого ошибка сценария сюда.

Как исправить

Delphi WebBrowser

Ошибка сценария

Ошибка скрипта

Исправляем все ошибки в Windows 10 в 2 клика.

Решаем ошибку сценария[delphi-hlp.ru]

  • Delphi error sending data 12175 произошла ошибка безопасности
  • Delphi bds exe ошибка
  • Delphi 7 unable to rename delphi32 ошибка
  • Delonghi ошибка op err
  • Delonghi magnifica ошибка очистки