我正在为Delphi创建autoform填充器,显然需要一个很好的方法来捕获每个站点上的哪些输入框是登录框,所以想知道我是否使用Twebbrowser组件并加载页面然后单击用户名和如果我可以提取我单击的表单名称和输入框名称,则会在特定网站上显示密码框。
简而言之,我需要delphi来捕获加载到twebbrowser组件中的网页上所选输入框的名称。
从twebbrowser页面加载的页面中捕获此信息的任何好方法都将不胜感激!
答案 0 :(得分:2)
以下代码显示了如何查找名为“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中提问。确保你包含你已经尝试过的细节(代码),因为缺乏它们的q往往不能很好地收到。
答案 1 :(得分:0)
抱歉我的格式化,新发布在这里!减少版本。
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;