You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi VCL应用向EdgeBrowser网页文本框粘贴及元素枚举求助

解决EdgeBrowser设置textarea值无效及枚举网页元素的方法

一、解决textarea值设置无效果的问题

排查及处理方案

  1. 核对元素ID是否匹配
    你提供的网页示例中textarea的ID是txtGoalTransaction275746_0,但代码里用的是txtGoalTransaction271900_0,先确认目标元素的真实ID。可以先执行调试脚本验证元素是否存在:
procedure TForm1.Button1Click(Sender: TObject);
begin
  EdgeBrowser1.ExecuteScript(
    'const elem = document.getElementById("txtGoalTransaction271900_0");' +
    'console.log(elem ? "元素存在" : "元素不存在");'
  );
end;

打开Edge开发者工具(F12)查看控制台输出,确认元素状态。

  1. 确保网页加载完成后执行脚本
    将设置值的代码移至EdgeBrowser1.DocumentCompleted事件中,避免网页未加载完全时执行:
procedure TForm1.EdgeBrowser1DocumentCompleted(Sender: TObject; const Args: TWebBrowserDocumentCompletedEventArgs);
begin
  EdgeBrowser1.ExecuteScript(
    'document.getElementById("txtGoalTransaction271900_0").value = "Test String";' +
    // 触发网页绑定的Count函数,保证页面逻辑正常触发
    'Count(document.getElementById("txtGoalTransaction271900_0"), 5000);'
  );
end;
  1. 手动触发绑定事件
    网页的textarea绑定了onkeyup和onchange事件,直接设置value不会自动触发这些事件,需手动调用:
procedure TForm1.Button1Click(Sender: TObject);
begin
  EdgeBrowser1.ExecuteScript(
    'const elem = document.getElementById("txtGoalTransaction271900_0");' +
    'elem.value = "Test String";' +
    'elem.dispatchEvent(new Event("keyup"));' +
    'elem.dispatchEvent(new Event("change"));'
  );
end;

二、枚举EdgeBrowser中的网页所有元素

通过执行JS脚本获取元素信息并返回给Delphi,以下是两种实现方式:

方法1:获取全部元素的基础信息

procedure TForm1.Button2Click(Sender: TObject);
var
  JSResult: JSValue;
  Elements: TJSArray;
  I: Integer;
  Elem: JSValue;
begin
  EdgeBrowser1.ExecuteScriptAsync(
    'Array.from(document.querySelectorAll("*")).map(elem => ({' +
    '  tagName: elem.tagName,' +
    '  id: elem.id,' +
    '  name: elem.name' +
    '}))',
    procedure(const AResult: JSValue; const AError: Exception)
    begin
      if Assigned(AError) then
      begin
        ShowMessage('执行失败: ' + AError.Message);
        Exit;
      end;
      Elements := TJSArray(AResult);
      for I := 0 to Elements.Length - 1 do
      begin
        Elem := Elements.Items[I];
        Memo1.Lines.Add(Format('标签: %s, ID: %s, Name: %s', [
          TJSValue(Elem['tagName']).AsString,
          TJSValue(Elem['id']).AsString,
          TJSValue(Elem['name']).AsString
        ]));
      end;
    end
  );
end;

方法2:仅枚举文本框类元素(textarea/input文本框)

修改JS脚本过滤指定类型元素:

Array.from(document.querySelectorAll('textarea, input[type="text"]')).map(elem => ({
  tagName: elem.tagName,
  id: elem.id,
  name: elem.name
}))

内容的提问来源于stack exchange,提问作者grant1842

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:01:14