如何从TEdgeBrowser获取响应文本?附新建窗体调用TEdgeBrowser示例代码
实现TEdgeBrowser获取页面响应文本的方案
TEdgeBrowser基于Chromium内核,需要通过执行JavaScript脚本来获取页面的响应内容,具体实现步骤如下:
第一步:添加成员变量与事件声明
首先在TForm1的类定义中添加私有成员存储页面内容,同时声明导航完成事件的处理方法:
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private FPageResponseText: string; // 存储页面响应文本 procedure BrowserFormClosed(Sender: TObject; var Action: TCloseAction); procedure BrowserNavCompleted(Sender: TObject; const AWebView: ICoreWebView2; const AArgs: ICoreWebView2NavigationCompletedEventArgs); public end;
第二步:绑定导航完成事件
修改原有Button1Click的代码,给TEdgeBrowser绑定导航完成事件,确保页面加载完成后再获取内容:
procedure TForm1.Button1Click(Sender: TObject); var Form: TForm; Brws: TEdgeBrowser; begin Form := TForm.Create(Self); Form.Width := 700; Form.Height := 700; Form.BorderStyle := bsDialog; Form.Position := poScreenCenter; Form.Caption := 'Google'; Form.OnClose := BrowserFormClosed; Brws := TEdgeBrowser.Create(Form); TWinControl(Brws).Parent := Form; Brws.Align := alClient; // 绑定导航完成事件,页面加载完成后触发 Brws.OnNavigationCompleted := BrowserNavCompleted; Form.Show; Brws.Navigate('http://google.com'); end;
第三步:实现获取页面内容的逻辑
在导航完成事件中执行JavaScript脚本获取页面内容,处理返回结果:
procedure TForm1.BrowserNavCompleted(Sender: TObject; const AWebView: ICoreWebView2; const AArgs: ICoreWebView2NavigationCompletedEventArgs); var Brws: TEdgeBrowser; begin Brws := Sender as TEdgeBrowser; // 判断导航是否成功 if AArgs.IsSuccess then begin // 执行JS获取整个页面的完整HTML代码,要纯文本可以替换为 document.body.innerText Brws.ExecuteScript('document.documentElement.outerHTML', procedure(const AResult: HResult; const AResultObject: string) begin if Succeeded(AResult) then begin // 处理返回的JSON格式字符串,去掉首尾引号和转义字符 FPageResponseText := AResultObject.Trim(['"']); FPageResponseText := StringReplace(FPageResponseText, '\"', '"', [rfReplaceAll]); FPageResponseText := StringReplace(FPageResponseText, '\n', #13#10, [rfReplaceAll]); // 这里可以直接处理获取到的内容,比如输出到日志、保存到文件 // ShowMessage('页面内容获取完成,长度:' + IntToStr(Length(FPageResponseText))); end; end); end; end;
补充说明
- 如果只需要页面的纯文本内容,将JS代码替换为
document.body.innerText即可 - 如果需要获取特定接口的响应内容而非页面HTML,需要监听CoreWebView2的WebResourceRequested事件,拦截对应请求的响应体
- ExecuteScript的回调是异步执行的,如果需要在窗体关闭时拿到最终内容,可以在BrowserFormClosed事件中等待回调完成,或者判断FPageResponseText是否已赋值
内容的提问来源于stack exchange,提问作者Blawjack
相关产品推荐
相关产品推荐

