Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / WebView2 / 11 сообщений из 11, страница 1 из 1
16.02.2022, 14:10
    #40134512
Maxim Rusov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebView2
Пытаюсь использовать WebView2 вместо IE. Доступа к DOM в нем нет, т.е. написать как раньше:

Код: pascal
1.
S = MyBrowser.OleObject.document.body.outerHTML


- Нельзя. Можно попробовать доступиться через JS, типа:

Код: pascal
1.
MyBrowser.GetEdgeInterface.DefaultInterface.ExecuteScript('document.body.outerHTML', ...)


Но он, с**а, асинхронный и ничего не возвращает. Ломать всю логику для для перехода на асинхронные события - без шансов.

В интернете - постоянно дается пример на C#

Код: c#
1.
html = Await WebView2.ExecuteScriptAsync("document.body.outerHTML")


Как это можно реализовать на Delphi?
...
Рейтинг: 0 / 0
16.02.2022, 15:06
    #40134540
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebView2
Там же в параметрах каллбэк процедура передается.
...
Рейтинг: 0 / 0
16.02.2022, 15:26
    #40134548
Maxim Rusov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebView2
Так она вызывается асинхронно. Как нибудь потом. А мне нужен результат сразу.
...
Рейтинг: 0 / 0
16.02.2022, 15:28
    #40134549
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebView2
Maxim Rusov
Так она вызывается асинхронно. А мне нужен результат сразу.



System.Threading.TTask.Future ?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
FutureObject := TTask.Future<Integer>(function: Integer
    begin
        Sleep(3000);
        Result := 16;
    end);
// …
MyValue := FutureObject.Value;



Ну или WaitForSigleObject прикрути.
...
Рейтинг: 0 / 0
16.02.2022, 15:32
    #40134552
Maxim Rusov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebView2
Сделай скидку на интеллектуальный уровень собеседника :). Куда тут вставить ExecuteScript?
...
Рейтинг: 0 / 0
16.02.2022, 16:50
    #40134575
Maxim Rusov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebView2
В общем, я, конечно, сделал через ProcessMessages. Но гложут меня сомнения, что "Await" реализована иначе...
...
Рейтинг: 0 / 0
16.02.2022, 17:19
    #40134594
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebView2
Как-то так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
unit Unit23;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, WebView2, Winapi.ActiveX, Vcl.Edge;

type
  TForm23 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TExecuteScriptCallBack = procedure(Value: string) of object;

  TExecuteScript = class
    Result: string;
    procedure OnExecuteScript(Value: string);
    procedure ExecuteScript(Script: string; CallBack: TExecuteScriptCallBack);
  end;

var
  Form23: TForm23;

implementation

uses
  System.Threading;

{$R *.dfm}

procedure TExecuteScript.ExecuteScript(Script: string; CallBack: TExecuteScriptCallBack);
begin
  Sleep(1000);
  CallBack('Ok');
end;

procedure TExecuteScript.OnExecuteScript(Value: string);
begin
  Result:=Value;
end;

{ TForm23 }

procedure TForm23.Button1Click(Sender: TObject);
begin
  var ExecuteScript:=TTask.Future<string>(function: string begin
                       var ES:=TExecuteScript.Create;
                       try
                         ES.ExecuteScript('test',Es.OnExecuteScript);
                         repeat
                           Sleep(1);
                         until ES.Result<>'';
                         Result:=ES.Result;
                       finally
                         ES.Free;
                       end;
                     end);


  ShowMessage(ExecuteScript.Value);
end;

end.


Привет синтаксическому сахару.
...
Рейтинг: 0 / 0
16.02.2022, 18:09
    #40134613
Maxim Rusov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebView2
Меня гложут смутные сомнения, что с Edge это работать не будет. ExecuteScript - это метод WebView, а не какая-то процедура, которую я сам написал. И callback он вызывает в главном потоке через посылку Windows Message...
...
Рейтинг: 0 / 0
16.02.2022, 18:33
    #40134617
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebView2
Maxim Rusov
callback он вызывает в главном потоке через посылку Windows Message...
Че, правда?

Меня терзают смутные сомнения.
Но если это так - тогда страдай и пиши полноценные каллбэки или разбор сообщений главного потока руками.

Ну или переноси свой синхронный код из главного потока, дабы он не блокировался.
...
Рейтинг: 0 / 0
18.02.2022, 14:17
    #40135148
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebView2
rgreat,

Ого, а можешь выложить тестовый проект, как ты WebView2 прикрутил?
...
Рейтинг: 0 / 0
18.02.2022, 14:33
    #40135156
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebView2
Не, лень.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / WebView2 / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]