(20-12-2022, Saat: 12:35)Husv Adlı Kullanıcıdan Alıntı: İyi günler.
FMX tarafında WebBrowser1 verileri nasıl alabilirim?
web sayfası bana özel sayfa tamamen boş sadece, textler var
Örnek: User, pasw, Lasdate alalardaki verileri döngü ile alacağım herhangi bir div veya span içinde değil textler boş html.
Ahmet 12345 20.12.2023
Ayşe 12345 20.12.2023
Nuray 12345 20.12.2023
procedure TMainForm.Button2Click(Sender: TObject);
var
i: Integer;
begin
for I := 0 to WebBrowser1.Document.Length - 1 do
begin
end;
end;
end;
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Memo.Types, FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox,
FMX.Memo, FMX.WebBrowser, IdContext, IdCustomHTTPServer, IdBaseComponent,
IdComponent, IdCustomTCPServer, IdHTTPServer;
type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Memo1: TMemo;
Button1: TButton;
Timer1: TTimer;
IdHTTPServer1: TIdHTTPServer;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo;
AResponseInfo: TIdHTTPResponseInfo);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
uses FMX.Platform, System.Rtti, IdGlobal;
procedure TForm1.FormCreate(Sender: TObject);
begin
webbrowser1.Navigate('https://www.google.com');
end;
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
memo1.lines.add('! IdHTTPServer1CommandGet');
if ARequestInfo.CommandType=THTTPCommandType.hcPOST then
begin
memo1.lines.add('POST: '+ ReadStringFromStream( ARequestInfo.PostStream, -1, IndyTextEncoding_UTF8 ) );
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer1.enabled:=False;
Button1Click(Sender);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
uClipBoard : IFMXClipboardService;
Value : TValue;
Text : string;
begin
WebBrowser1.EvaluateJavaScript( ' var veri=document.documentElement.outerHTML; '+
' xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", "http://127.0.0.1:8090", true); xmlhttp.send(veri); ');
end;
end.
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 708
ClientWidth = 490
Position = ScreenCenter
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
OnCreate = FormCreate
DesignerMasterStyle = 3
object WebBrowser1: TWebBrowser
Align = Top
Size.Width = 490.000000000000000000
Size.Height = 181.000000000000000000
Size.PlatformDefault = False
WindowsEngine = EdgeIfAvailable
end
object Memo1: TMemo
Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
DataDetectorTypes = []
Align = Top
Position.Y = 181.000000000000000000
Size.Width = 490.000000000000000000
Size.Height = 224.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
Viewport.Width = 482.000000000000000000
Viewport.Height = 216.000000000000000000
end
object Button1: TButton
Align = Client
Size.Width = 490.000000000000000000
Size.Height = 303.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
Text = 'Button1'
OnClick = Button1Click
end
object Timer1: TTimer
Interval = 3000
OnTimer = Timer1Timer
Left = 400
Top = 489
end
object IdHTTPServer1: TIdHTTPServer
Active = True
Bindings = <
item
IP = '127.0.0.1'
Port = 8090
end>
DefaultPort = 8090
OnCommandGet = IdHTTPServer1CommandGet
Left = 16
Top = 433
end
end
(20-12-2022, Saat: 20:39)mrmarman Adlı Kullanıcıdan Alıntı: FMX yapıda platform gereği; TWebBrowser ile değil de
// System.Net.HttpClientComponent unitindedir...
TNetHTTPClient
ile verileri çekmeyi düşünmek isteyebilirsiniz.
Örnek :
uses System.Net.HttpClientComponent, System.Net.HttpClient;
function MakeRequest(aUrl: string): string;
var
LClient : System.Net.HttpClientComponent.TNetHTTPClient;
LResponse : System.Net.HttpClient.IHTTPResponse;
begin
LClient := TNetHTTPClient.Create(nil);
try
LClient.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36';
LClient.Accept := 'text/html';
LResponse := LClient.Get(aUrl);
// 404 not forund
// 200 OK
case LResponse.StatusCode of
200: // success
Result := LResponse.ContentAsString;
404: // not found
Result := '[ERROR] Page not found...';
else
Result := '[ERROR]' + sLineBreak + LResponse.ContentAsString;
end;
finally
FreeAndNil(LClient);
end;
end;
Kullanımı :
procedure TForm1.Button1Click(Sender: TObject);
var
LContent : string;
begin
LContent := MakeRequest('https://www.google.com.tr');
// ...
end;
fikir vermesi açısından yaptım, biraz ters oldu ama sanırım yapabileceğimiz android tarafında en fazla bu şekilde olacakdır, sizin bunu daha güzel bir hale getireceğinize eminim.
js ile "document.documentElement.outerHTML" clipboard a write denedim ilginç bir şekilde yazamadı, araştırmak lasım, o şekilde soket serversiz daha kolay olurdu.
esasında executejavascript in return değeri kaldırılmış, procedure ye çevirilmiş oysaki oradan evulate yapılabilinirdi.
bu yapı ile yine js kullanılarak sayfa içi görsel aksiyonlardan sonra, fmx uygulamaya bir işlem yaptırmak için trigger da yaptırılabilir.