【问题标题】:Detect Twebbrowser inputbox click in delphi XE2在delphi XE2中检测Twebbrowser输入框点击
【发布时间】:2016-11-30 21:02:22
【问题描述】:

我正在为 Delphi 创建自动填充程序,显然需要一个好的方法来捕获每个站点上的登录框是哪些输入框,所以想知道我是否使用 Twebbrowser 组件并加载页面然后单击用户名和如果我可以提取我单击的表单名称和输入框名称,则特定站点上的密码框。

简而言之,我需要 delphi 来捕获加载到 twebbrowser 组件中的网页上选定输入框的名称。

任何从 twebbrowser 页面中加载的页面捕获此信息的好方法将不胜感激!。

【问题讨论】:

  • 您想对任意页面执行此操作
  • 是的,大卫,基本上我有数百个网站,这些网站主要是与艺术作品相关的,这些年来我已经注册了这些网站,并且正在设置一个启动板以轻松访问这些网站,而无需记住所有密码或使用第三方密码实用程序。我可以捕获表单和所有字段,但只想为用户名和密码选择每个框,这些框在每个站点上可能具有不同的输入框名称,并让 delphi 捕获我单击的 Web 表单输入框的名称和然后将它们与页面 URL 一起添加到字符串列表中。
  • 我以前从未参与过这个,但我相信我需要检测在 twebbrowser 加载的网页中哪个 html 元素具有焦点,如果它是一个输入框,那么捕获输入框的名称以及如果表单没有名称,则表单名称或表单编号。
  • 这是一篇尝试做类似事情的参考文章。 delphidabbler.com/articles?article=19
  • 这可能是方法,所以会玩一玩,即使不是很精通这个。 (文档为 IHTMLDocument2).activeElement;

标签: delphi input selected


【解决方案1】:

以下代码显示了如何查找名为“input1”的 INPUT 元素:

var
  E : IHtmlElement;
  D : IHtmlDomNode;
  Doc2 : IHtmlDocument2;
  Doc3 : IHtmlDocument3;
  All : IHTMLElementCollection;
  i : Integer;

begin
  Doc3 := WebBrowser1.Document as IHtmlDocument3;
  D := Doc3.GetElementByID('input1') as IHtmlDomNode;
  if D <> Nil then begin
    ...

如果您需要查找多个 INPUT 元素或者您希望对 INPUT 元素的名称,您可以通过检索文档的 IHtmlDocument2 接口,然后迭代其all 集合:

  Doc2 := WebBrowser1.Document as IHtmlDocument2;
  All := Doc2.all;
  for i := 0 to All.Length - 1 do begin
    E := All.Item(Null, i) as IHtmlElement;
    // Test E and do what you like with it
  end;

您可以使用这样的函数来查找 INPUT 元素的父 FORM 元素

function GetParentFormElement(E : IHtmlElement) : IHtmlElement;
begin
  Result := Nil;
  while E <> Nil do begin
    if CompareText(E.tagName, 'form') = 0 then begin
      Result := E;
      exit;
    end;
    E := E.parentElement;
  end;
end;

并像这样使用它:

E := D as IHtmlElement;
E := GetParentFormElement(E);
Assert(E <> Nil);

并非所有表单都有名称或 ID,如果页面中有多个表单,我如何获取父表单的编号或引用?

同样,并非所有INPUT 元素都包含在FORM 之一中。 TBH,我不知道有一种稳健的方式来做你想做的事,这将在页面作者对其进行更改后继续存在。无论如何,必须有某种方法来识别给定的INPUT 元素,否则服务器将无法提取用户的响应,不是吗?所以这只是一个弄清楚特定页面可能是什么的问题。如果它不在元素的属性中,那么也许您可以查找附近文本元素的文本 - 毕竟,必须有某种提示让用户告诉他们在哪里填写什么。但这与您原来的 q 的实质内容确实是一个不同的问题,我希望我已经回答了。如果您在这个特定点上需要更多帮助,我建议您在新的 q 中提问。确保您包含您已经尝试过的详细信息(代码),因为缺少它们的 qs 往往不会在 SO 中得到很好的接受。

【讨论】:

  • 感谢您的反馈 Martyn,这只是我需要的信息,即使我选择了页面上的选择元素,因为当我需要信息时我会在页面上,但我还需要找到我也选择的输入框的父窗体的编号。我该怎么做呢?。
  • 我不太清楚“父表单的编号”是什么意思,但我在答案中添加了一些代码,以显示如何查找输入框的父表单。大概一旦你找到了表单元素,你就能得到你想要的信息?
  • 非常适合我想要实现的 Martyn,稍后我会尝试一下,让你知道我是怎么做到的!
  • 表单号 Martyn 是如果页面上有多个表单所以我在添加用户名和密码字段后提交正确的表单。WebBrowser.OleObject.Document.Forms 返回页面上的表单集合. .Length 返回文档中表格的数量。 .Item(0) 返回第一个表单。等效文档: var htmlDoc: IHTMLDocument2; allForms:IHTMLElementCollection; firstForm:IHTMLFormElement;开始 htmlDoc := WebBrowser.Document 作为 IHTMLDocument2; allForms := htmlDoc.Forms; firstForm := allForms.Item(0,'') as IHTMLFormElement;
  • 如您所见,我在格式化代码时遇到问题,但现在正在阅读..
【解决方案2】:

抱歉我的格式,新来这里发帖!。精简版。

procedure TForm5.Button2Click(Sender: TObject);
var
Document: IHTMLdocument2;
MyEl: IHTMLElement;
begin
    MyEl := (WebBrowser1.Document as IHTMLDocument2).activeElement;
        If MyEl.tagName = 'INPUT' then
            begin
                 edit2.Text := MyEl.getAttribute('Name', 0);
            end;
end; 

【讨论】:

  • 这似乎不是您的 q 的答案,因此您应该真正编辑您的 q 以包含它,然后删除此答案。在 SO,答案是针对 q 的答案,而不是添加/事后想法/cmets。如果您仍然需要帮助,我已经向您发布了我自己的答案。
猜你喜欢
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
相关资源
最近更新 更多